Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 21 additions & 10 deletions ldap/src/main/java/org/openmbee/mms/ldap/LdapSecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ LdapAuthoritiesPopulator ldapAuthoritiesPopulator(@Qualifier("contextSource") Ba

/*
Specificity here : we don't get the Role by reading the members of available groups (which is implemented by
default in Spring security LDAP), but we retrieve the groups from the field memberOf of the user.
default in Spring security LDAP), but we retrieve the groups the user belongs to.
*/
class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator {

Expand All @@ -126,11 +126,11 @@ private CustomLdapAuthoritiesPopulator(BaseLdapPathContextSource ldapContextSour
@Override
public Collection<? extends GrantedAuthority> getGrantedAuthorities(
DirContextOperations userData, String username) {
logger.debug("Populating authorities using LDAP");
Optional<User> userOptional = userRepository.findByUsername(username);

if (!userOptional.isPresent()) {
if (userOptional.isEmpty()) {
User newUser = createLdapUser(userData);

userOptional = Optional.of(newUser);
}

Expand All @@ -139,13 +139,20 @@ public Collection<? extends GrantedAuthority> getGrantedAuthorities(
saveLdapUser(userData, user);
}
user.setPassword(null);
String userDn = userAttributesUsername + "=" + user.getUsername() + "," + providerBase;

StringBuilder userDnBuilder = new StringBuilder();
userDnBuilder.append(userData.getDn().toString());
if (providerBase != null && !providerBase.isEmpty()) {
userDnBuilder.append(',');
userDnBuilder.append(providerBase);
}
String userDn = userDnBuilder.toString();

List<Group> definedGroups = groupRepository.findAll();
OrFilter orFilter = new OrFilter();

for (int i = 0; i < definedGroups.size(); i++) {
orFilter.or(new EqualsFilter(groupRoleAttribute, definedGroups.get(i).getName()));
for (Group definedGroup : definedGroups) {
orFilter.or(new EqualsFilter(groupRoleAttribute, definedGroup.getName()));
}

AndFilter andFilter = new AndFilter();
Expand All @@ -154,9 +161,11 @@ public Collection<? extends GrantedAuthority> getGrantedAuthorities(
andFilter.and(groupsFilter);
andFilter.and(orFilter);

String filter = andFilter.encode();
logger.debug("Searching LDAP with filter: {}", filter);
Set<String> memberGroups = ldapTemplate
.searchForSingleAttributeValues("", andFilter.encode(), new Object[]{""},
groupRoleAttribute);
.searchForSingleAttributeValues(groupSearchBase, filter, new Object[]{""}, groupRoleAttribute);
logger.debug("LDAP search result: {}", Arrays.toString(memberGroups.toArray()));

Set<Group> addGroups = new HashSet<>();
for (String memberGroup : memberGroups) {
Expand Down Expand Up @@ -186,6 +195,7 @@ public BaseLdapPathContextSource contextSource() {
providerUrl);
contextSource.setUserDn(providerUserDn);
contextSource.setPassword(providerPassword);
contextSource.setBase(providerBase);
return contextSource;
}

Expand All @@ -210,13 +220,14 @@ private User saveLdapUser(DirContextOperations userData, User saveUser) {
}

private User createLdapUser(DirContextOperations userData) {
String username = userData.getStringAttribute(userAttributesUsername);
logger.debug("Creating user for {} using LDAP", username);
User user = saveLdapUser(userData, new User());
user.setUsername(userData.getStringAttribute(userAttributesUsername));
user.setUsername(username);
user.setEnabled(true);
user.setAdmin(false);
userRepository.save(user);


return user;
}
}