Skip to content

Commit

Permalink
Fixed AD import (#614)
Browse files Browse the repository at this point in the history
  • Loading branch information
marpozh authored and pavgra committed Sep 26, 2018
1 parent 6a4ed3a commit d1ac36e
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 17 deletions.
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
<security.ad.searchFilter></security.ad.searchFilter>
<security.ad.ignore.partial.result.exception>true</security.ad.ignore.partial.result.exception>
<security.ad.result.count.limit>30000</security.ad.result.count.limit> <!-- 0 means no limit -->
<security.ad.default.import.group>public</security.ad.default.import.group>

<security.cas.loginUrl></security.cas.loginUrl>
<security.cas.callbackUrl></security.cas.callbackUrl>
Expand Down
18 changes: 14 additions & 4 deletions src/main/java/org/ohdsi/webapi/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.ohdsi.webapi.shiro.Entities.UserEntity;
import org.ohdsi.webapi.shiro.PermissionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
Expand All @@ -42,6 +43,9 @@ public class UserService {
@Autowired
private ApplicationEventPublisher eventPublisher;

@Value("${security.ad.default.import.group}#{T(java.util.Collections).emptyList()}")
private List<String> defaultRoles;

private Map<String, String> roleCreatorPermissionsTemplate = new LinkedHashMap<>();

public UserService() {
Expand Down Expand Up @@ -99,6 +103,7 @@ public int compareTo(Permission o) {
public static class Role implements Comparable<Role> {
public Long id;
public String role;
public boolean defaultImported;

public Role() {}

Expand All @@ -107,6 +112,11 @@ public Role (RoleEntity roleEntity) {
this.role = roleEntity.getName();
}

public Role (RoleEntity roleEntity, boolean defaultImported) {
this(roleEntity);
this.defaultImported = defaultImported;
}

@Override
public int compareTo(Role o) {
Comparator c = Comparators.naturalOrder();
Expand Down Expand Up @@ -295,7 +305,7 @@ public ArrayList<Permission> getPermissions() {
}

private ArrayList<Permission> convertPermissions(final Iterable<PermissionEntity> permissionEntities) {
ArrayList<Permission> permissions = new ArrayList<Permission>();
ArrayList<Permission> permissions = new ArrayList<>();
for (PermissionEntity permissionEntity : permissionEntities) {
Permission permission = new Permission(permissionEntity);
permissions.add(permission);
Expand All @@ -305,17 +315,17 @@ private ArrayList<Permission> convertPermissions(final Iterable<PermissionEntity
}

private ArrayList<Role> convertRoles(final Iterable<RoleEntity> roleEntities) {
ArrayList<Role> roles = new ArrayList<Role>();
ArrayList<Role> roles = new ArrayList<>();
for (RoleEntity roleEntity : roleEntities) {
Role role = new Role(roleEntity);
Role role = new Role(roleEntity, defaultRoles.contains(roleEntity.getName()));
roles.add(role);
}

return roles;
}

private ArrayList<User> convertUsers(final Iterable<UserEntity> userEntities) {
ArrayList<User> users = new ArrayList<User>();
ArrayList<User> users = new ArrayList<>();
for (UserEntity userEntity : userEntities) {
User user = new User(userEntity);
users.add(user);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.apache.shiro.web.util.WebUtils;
import org.ohdsi.webapi.shiro.PermissionManager;
import org.ohdsi.webapi.shiro.TokenManager;
import org.ohdsi.webapi.util.UserUtils;

/**
*
Expand Down Expand Up @@ -80,9 +81,7 @@ protected boolean preHandle(ServletRequest request, ServletResponse response) th
throw new Exception("Unknown type of principal");
}

if (login != null) {
login = login.toLowerCase();
}
login = UserUtils.toLowerCase(login);

// stop session to make logout of OAuth users possible
Session session = SecurityUtils.getSubject().getSession(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.ohdsi.webapi.shiro.Entities.UserEntity;
import org.ohdsi.webapi.shiro.Entities.UserRepository;
import org.ohdsi.webapi.shiro.PermissionManager;
import org.ohdsi.webapi.util.UserUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -75,7 +76,7 @@ public List<AtlasUserRoles> findUsers(LdapProviderType providerType, RoleGroupMa
.map(user -> {
AtlasUserRoles atlasUser = new AtlasUserRoles();
atlasUser.setDisplayName(user.getDisplayName());
atlasUser.setLogin(user.getLogin());
atlasUser.setLogin(UserUtils.toLowerCase(user.getLogin()));
List<UserService.Role> roles = user.getGroups().stream()
.flatMap(g -> mapping.getRoleGroups()
.stream()
Expand All @@ -93,15 +94,18 @@ public List<AtlasUserRoles> findUsers(LdapProviderType providerType, RoleGroupMa

@Override
@Transactional
public void importUsers(List<AtlasUserRoles> users) {
public void importUsers(List<AtlasUserRoles> users, List<String> defaultRoles) {

users.forEach(user -> {
String login = UserUtils.toLowerCase(user.getLogin());
Set<String> roles = user.getRoles().stream().map(role -> role.role).collect(Collectors.toSet());
roles.addAll(defaultRoles);
try {
UserEntity userEntity;
if (LdapUserImportStatus.MODIFIED.equals(user.getStatus()) && Objects.nonNull(userEntity = userRepository.findByLogin(user.getLogin()))) {
if (Objects.nonNull(userEntity = userRepository.findByLogin(login)) &&
LdapUserImportStatus.MODIFIED.equals(getStatus(userEntity, user.getRoles()))) {
Set<RoleEntity> userRoles = userManager.getUserRoles(userEntity.getId());
userRoles.forEach(r -> {
userRoles.stream().filter(role -> !role.getName().equalsIgnoreCase(login)).forEach(r -> {
try {
userManager.removeUserFromRole(r.getName(), userEntity.getLogin());
} catch (Exception e) {
Expand All @@ -116,10 +120,10 @@ public void importUsers(List<AtlasUserRoles> users) {
}
});
} else {
userManager.registerUser(user.getLogin(), roles);
userManager.registerUser(login, roles);
}
} catch (Exception e) {
logger.error("Failed to register user {}", user.getLogin(), e);
logger.error("Failed to register user {}", login, e);
}
});
}
Expand Down Expand Up @@ -177,11 +181,17 @@ public void testConnection(LdapProviderType providerType) {

private LdapUserImportStatus getStatus(AtlasUserRoles atlasUser) {

LdapUserImportStatus result = LdapUserImportStatus.NEW_USER;
UserEntity userEntity = userRepository.findByLogin(atlasUser.getLogin());
return getStatus(userEntity, atlasUser.getRoles());
}

private LdapUserImportStatus getStatus(UserEntity userEntity, List<UserService.Role> atlasUserRoles) {

LdapUserImportStatus result = LdapUserImportStatus.NEW_USER;

if (Objects.nonNull(userEntity)) {
List<Long> atlasRoleIds = userEntity.getUserRoles().stream().map(userRole -> userRole.getRole().getId()).collect(Collectors.toList());
List<Long> mappedRoleIds = atlasUser.getRoles().stream().map(role -> role.id).collect(Collectors.toList());
List<Long> mappedRoleIds = atlasUserRoles.stream().map(role -> role.id).collect(Collectors.toList());
result = CollectionUtils.isEqualCollection(atlasRoleIds, mappedRoleIds) ? LdapUserImportStatus.EXISTS : LdapUserImportStatus.MODIFIED;
}
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ public class UserImportService {
@Value("${security.ldap.url}")
private String ldapUrl;

@Value("${security.ad.default.import.group}#{T(java.util.Collections).emptyList()}")
private List<String> defaultRoles;

@GET
@Path("user/providers")
@Produces(MediaType.APPLICATION_JSON)
Expand Down Expand Up @@ -90,7 +93,7 @@ public List<AtlasUserRoles> findDirectoryUsers(@PathParam("type") String type, R
@Path("user/import")
@Consumes(MediaType.APPLICATION_JSON)
public Response importUsers(List<AtlasUserRoles> users) {
userImporter.importUsers(users);
userImporter.importUsers(users, defaultRoles);
return Response.ok().build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public interface UserImporter {

List<AtlasUserRoles> findUsers(LdapProviderType providerType, RoleGroupMapping mapping);

void importUsers(List<AtlasUserRoles> users);
void importUsers(List<AtlasUserRoles> users, List<String> defaultRoles);

void saveRoleGroupMapping(LdapProviderType providerType, List<RoleGroupMappingEntity> mappingEntities);

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/ohdsi/webapi/util/UserUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,9 @@ public static String nullSafeLogin(UserEntity user) {
return Objects.nonNull(user) ? user.getLogin() : "";
}

public static String toLowerCase(String input) {

return Objects.nonNull(input) ? input.toLowerCase() : input;
}

}
1 change: 1 addition & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ security.ad.system.password=${security.ad.system.password}
security.ad.searchFilter=${security.ad.searchFilter}
security.ad.ignore.partial.result.exception=${security.ad.ignore.partial.result.exception}
security.ad.result.count.limit=${security.ad.result.count.limit}
security.ad.default.import.group=${security.ad.default.import.group}

security.googleIap.cloudProjectId=${ssecurity.googleIap.cloudProjectId}
security.googleIap.backendServiceId=${security.googleIap.backendServiceId}
Expand Down

0 comments on commit d1ac36e

Please sign in to comment.