/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.geofence.ldap.dao.impl; import org.geoserver.geofence.core.dao.GSUserDAO; import org.geoserver.geofence.core.model.GSUser; import org.geoserver.geofence.core.model.UserGroup; import java.util.HashSet; import java.util.List; import java.util.Set; import org.springframework.ldap.core.AttributesMapper; import com.googlecode.genericdao.search.Filter; /** * GSUserDAO implementation, using an LDAP server as a primary source, and the original * JPA based DAO as a backup. * * @author "Mauro Bartolomeoli - mauro.bartolomeoli@geo-solutions.it" * */ public class GSUserDAOLdapImpl extends BaseDAO<GSUserDAO,GSUser> implements GSUserDAO { private String groupsBase = "ou=Groups"; private AttributesMapper groupsAttributesMapper; String userDn = "uid=%s,ou=People"; /** * */ public GSUserDAOLdapImpl() { super(); // set default search base and filter for users setSearchBase("ou=People"); setSearchFilter("objectClass=inetOrgPerson"); } /** * Sets the base name for groups in LDAP server. * Used to extract groups bounded to the user. * * @param groupsBase the groupsBase to set */ public void setGroupsBase(String groupsBase) { this.groupsBase = groupsBase; } /** * Sets the userDn template, to quickly locate a user into an LDAP server, * by its distinguished name. * It's a template, filled with the user name (use %s as a placeholder for that=. * * @param userDn the userDn to set */ public void setUserDn(String userDn) { this.userDn = userDn; } /** * Sets the AttributeMapper used to build UserGroup objects from LDAP * objects. * * @param groupsAttributesMapper the groupsAttributesMapper to set */ public void setGroupsAttributesMapper(AttributesMapper groupsAttributesMapper) { this.groupsAttributesMapper = groupsAttributesMapper; } @Override public Set<UserGroup> getGroups(Long id) { GSUser user = find(id); fillWithGroups(user); return user.getGroups(); } /** * Gets the list of user groups from the LDAP server for the given user. * * @param user * @return */ private Set<UserGroup> getGroups(GSUser user) { Set<UserGroup> groups = new HashSet<UserGroup>(); Filter filter = new Filter("member", user.getName()); List<UserGroup> groupsList = search(groupsBase, filter, groupsAttributesMapper); groups.addAll(groupsList); return groups; } @Override public GSUser getFull(Long id) { GSUser user = find(id); if(user != null) { return fillWithGroups(user); } return null; } @Override public GSUser getFull(String name) { return fillWithGroups(lookup(String.format(userDn, name))); } /** * Updates the groups list for the given user. * * @param gsUser * @return */ private GSUser fillWithGroups(GSUser user) { user.setGroups(getGroups(user)); return user; } }