Picketlink IDM Group List
ed_mann Nov 26, 2013 11:15 AMI was able to get LDAP authentication to work via the code below.
import static org.picketlink.common.constants.LDAPConstants.CN;
import static org.picketlink.common.constants.LDAPConstants.CREATE_TIMESTAMP;
import static org.picketlink.common.constants.LDAPConstants.EMAIL;
import static org.picketlink.common.constants.LDAPConstants.GROUP_OF_NAMES;
import static org.picketlink.common.constants.LDAPConstants.SN;
import static org.picketlink.common.constants.LDAPConstants.UID;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import org.picketlink.idm.config.IdentityConfiguration;
import org.picketlink.idm.config.IdentityConfigurationBuilder;
import org.picketlink.idm.model.basic.Agent;
import org.picketlink.idm.model.basic.Grant;
import org.picketlink.idm.model.basic.Group;
import org.picketlink.idm.model.basic.GroupMembership;
import org.picketlink.idm.model.basic.Role;
import org.picketlink.idm.model.basic.User;
/**
* @author Edward Mann
*
*/
@ApplicationScoped
public class IDMConfiguration {
private static final String BASE_DN = "dc=example,dc=com";
private static final String LDAP_URL = "ldap://127.0.0.1:389";
private static final String GROUP_DN_SUFFIX = "ou=Groups,dc=example,dc=com";
private static final String USER_DN_SUFFIX = "ou=People,dc=example,dc=com";
private static final String AGENT_DN_SUFFIX = "ou=People,dc=example,dc=com";
/**
* <p>
* We use this method to produce a {@link IdentityConfiguration} configured
* with a LDAP store.
* </p>
*
* @return
*/
@Produces
public IdentityConfiguration configure() {
return initLDAP();
}
private IdentityConfiguration initLDAP(){
IdentityConfigurationBuilder builder = new IdentityConfigurationBuilder();
builder.named("ldap.config")
.stores()
.ldap().supportAllFeatures()
.baseDN(BASE_DN)
.bindDN("uid=manager,ou=special users, dc=example, dc=com")
.bindCredential("somepassword").url(LDAP_URL)
.supportCredentials(true)
.mapping(Agent.class).baseDN(AGENT_DN_SUFFIX)
.objectClasses("inetOrgPerson")
.attribute("loginName", UID, true)
.readOnlyAttribute("createdDate", CREATE_TIMESTAMP)
.mapping(User.class).baseDN(USER_DN_SUFFIX)
.objectClasses("inetOrgPerson")
.attribute("loginName", UID, true).attribute("firstName", "givenname")
.attribute("lastName", SN).attribute("email", EMAIL)
.readOnlyAttribute("createdDate", CREATE_TIMESTAMP)
.mapping(Group.class).baseDN(GROUP_DN_SUFFIX)
.objectClasses("groupofuniquenames", "posixgroup").attribute("name", CN, true)
.readOnlyAttribute("createdDate", CREATE_TIMESTAMP).parentMembershipAttributeName("uniquemember")
.mapping(GroupMembership.class)
.forMapping(Group.class)
.attribute("member", "uniquemember");
return builder.build();
}
}
I am using initLDAP because i have another method to initAD because it requires some other options, i did not include that method here as i am only trying to get my 389 Directory server group lists. After i figure that out i feel confident that i can get AD to work.
Here is my login controller.
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.picketlink.Identity;
import org.picketlink.Identity.AuthenticationResult;
import org.picketlink.idm.IdentityManager;
import org.picketlink.idm.model.basic.Group;
import org.picketlink.idm.query.IdentityQuery;
/**
* @author Edward Mann
*
*/
@Named
@RequestScoped
public class LoginController {
@Inject
private Identity identity;
@Inject
private FacesContext facesContext;
@Inject
private IdentityManager identityManager;
public String login() {
// let's authenticate the user. the credentials were provided by populating the <code>loginCredentials</code>
// named bean directly.
AuthenticationResult result = identity.login();
String ref = null;
if (AuthenticationResult.FAILED.equals(result)) {
ref = "/home.xhtml";
} else {
this.facesContext.addMessage(null, new FacesMessage(
"Authentication was unsuccessful. Please check your username and password " + "before trying again."));
}
return ref;
}
public String logout() {
this.identity.logout();
return "/login.xhtml";
}
/**
* Trying to find groups configured in ldap server
*/
public List<Group> getGroups(){
IdentityQuery<Group> query = identityManager.createIdentityQuery(Group.class);
List<Group> groups = query.getResultList();
return groups;
}
}
When i call the getGroups method it returns empty. Can someone give me some clues as to how i can get picketlink to return all (as many as ldap server will return) groups in the system? I will also like to be able to filter those. I know with the query i can set parameters. But first i just want to see if i can get a list of groups returned.
I am using picketlink-2.5.3.Beta1
Thanks