From c8f856fbeddda6e19e78b2d8facaff1a1b565278 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 19 Oct 2022 13:31:06 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-106 --- clearing-parent/backend-api/pom.xml | 4 +++ ...oakRestTemplateAuthenticationProvider.java | 25 ++++++++++++++----- .../security/WebSecurityConfig.java | 3 ++- .../clearing/utility/service/UserService.java | 25 ++++++++----------- .../service/UserServiceChangeRolesTest.java | 8 +++--- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index ea35a674c..f904cac27 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -57,6 +57,10 @@ ru.spcex.clearing dictionary + + ru.spcex.platform + platform-enum + diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakRestTemplateAuthenticationProvider.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakRestTemplateAuthenticationProvider.java index 938127416..8f09f25c5 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakRestTemplateAuthenticationProvider.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakRestTemplateAuthenticationProvider.java @@ -27,13 +27,11 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import ru.spcex.clearing.backendapi.service.UserAuthProcessor; +import ru.spcex.platform.enumeration.UserRole; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Component("keycloakRestAuthenticationProvider") @@ -44,6 +42,13 @@ public class KeycloakRestTemplateAuthenticationProvider implements Authenticatio private final HttpServletResponse currentHttpResponse; private final RestTemplate restTemplate; private final UserAuthProcessor userAutoCreation; + private final static Map roleMapping = new HashMap<>(); + + static { + roleMapping.put("CS_MKR_ADMIN", UserRole.Admin); + roleMapping.put("CS_MKR_SUPERVISER", UserRole.Superviser); + roleMapping.put("CS_MKR_SECURITY", UserRole.Security); + } public KeycloakRestTemplateAuthenticationProvider(KeycloakConfigResolver resolver, HttpServletRequest currentHttpRequest, HttpServletResponse currentHttpResponse, @Qualifier("clearing-rest") RestTemplate restTemplate, UserAuthProcessor userAutoCreation) { @@ -82,12 +87,20 @@ public class KeycloakRestTemplateAuthenticationProvider implements Authenticatio AccessToken accessToken = AdapterTokenVerifier.verifyToken(accessTokenString, deployment); //todo cors settings accessToken.setAllowedOrigins(Collections.singleton("*")); - List realmRoles = accessToken.getRealmAccess().getRoles().stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList()); RefreshableKeycloakSecurityContext skSession = new RefreshableKeycloakSecurityContext(deployment, null, accessTokenString, accessToken, null, null, refreshTokenString); String principalName = AdapterUtils.getPrincipalName(deployment, accessToken); final KeycloakPrincipal principal = new KeycloakPrincipal<>(principalName, skSession); - final Set roles = AdapterUtils.getRolesFromSecurityContext(skSession); + Set roles = AdapterUtils.getRolesFromSecurityContext(skSession); + roles = roles + .stream() + .map(s -> { + UserRole userRole = roleMapping.get(s); + return userRole != null ? userRole.getKey() : null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + List realmRoles = roles.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList()); final KeycloakAccount account = new SimpleKeycloakAccount(principal, roles, skSession); KeycloakAuthenticationToken keycloakAuthenticationToken = new KeycloakAuthenticationToken(account, false, realmRoles); keycloakAuthenticationToken.setAuthenticated(true); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/WebSecurityConfig.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/WebSecurityConfig.java index 3d5a25a21..2100f9166 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/WebSecurityConfig.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/WebSecurityConfig.java @@ -18,6 +18,7 @@ import org.springframework.security.web.authentication.session.SessionAuthentica import ru.spcex.clearing.backendapi.config.element.BackendApiSettings; import ru.spcex.clearing.backendapi.security.handlers.AuthAuditSuccessLoginHandler; import ru.spcex.clearing.backendapi.security.handlers.LogoutAuditSuccessHandler; +import ru.spcex.platform.enumeration.UserRole; @KeycloakConfiguration @EnableGlobalMethodSecurity(prePostEnabled = true) @@ -68,7 +69,7 @@ public class WebSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { if (securityDisabled) { anyReq.permitAll(); } else { - anyReq.hasAnyRole("admin", "default-roles-master") + anyReq.hasAnyRole(UserRole.Admin.getKey(), UserRole.Security.getKey(), UserRole.Superviser.getKey()) .and() .formLogin() .successHandler(loginSuccessHandler) diff --git a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserService.java b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserService.java index 703844915..6856fe3d7 100644 --- a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserService.java +++ b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserService.java @@ -20,12 +20,12 @@ import ru.spcex.platform.enumeration.Status; import ru.spcex.platform.enumeration.UserRole; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.IEnumKey; import java.time.Instant; import java.time.LocalDate; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -33,14 +33,6 @@ import java.util.stream.Stream; @Service public class UserService extends QueueConsumer implements InitializingBean { - private final static Map roleMapping = new HashMap<>(); - - static { - roleMapping.put("CS_MKR_ADMIN", UserRole.Admin); - roleMapping.put("CS_MKR_SUPERVISER", UserRole.Superviser); - roleMapping.put("CS_MKR_SECURITY", UserRole.Security); - } - private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg userMap; private final Imdg userRoleSessionImdg; @@ -55,11 +47,16 @@ public class UserService extends QueueConsumer implements InitializingBean { } static Collection defineAllRoleChanges(Collection presentRoles, Collection authRoles) { - Collection finalAuthRoles = authRoles.stream().flatMap((Function>) keycloakRole -> { - UserRole userRole = roleMapping.get(keycloakRole); - if (userRole == null) return Stream.empty(); - return Stream.of(userRole.getKey()); - }).collect(Collectors.toList()); + Collection finalAuthRoles = authRoles + .stream() + .flatMap((Function>) s -> { + if (IEnumKey.getEnumByKey(UserRole.class, s) != null) { + return Stream.of(s); + } else { + return Stream.empty(); + } + }) + .collect(Collectors.toList()); return Stream.concat( presentRoles .stream() diff --git a/clearing-parent/utility-service/src/test/java/ru/spcex/clearing/utility/service/UserServiceChangeRolesTest.java b/clearing-parent/utility-service/src/test/java/ru/spcex/clearing/utility/service/UserServiceChangeRolesTest.java index 7345be000..caee92fae 100644 --- a/clearing-parent/utility-service/src/test/java/ru/spcex/clearing/utility/service/UserServiceChangeRolesTest.java +++ b/clearing-parent/utility-service/src/test/java/ru/spcex/clearing/utility/service/UserServiceChangeRolesTest.java @@ -20,7 +20,7 @@ class UserServiceChangeRolesTest { public void testTwoNewRoles() { Collection userRoles = new ArrayList<>(); userRoles.add(generate(UserRole.Admin.getKey(), Status.Active)); - Collection methodsFromAuth = List.of("CS_MKR_ADMIN", "CS_MKR_SUPERVISER", "CS_MKR_SECURITY"); + Collection methodsFromAuth = List.of(UserRole.Admin.getKey(), UserRole.Superviser.getKey(), UserRole.Security.getKey()); Collection roleActions = UserService.defineAllRoleChanges(userRoles, methodsFromAuth); assertEquals(2, roleActions.size()); @@ -35,7 +35,7 @@ class UserServiceChangeRolesTest { Collection userRoles = new ArrayList<>(); userRoles.add(generate(UserRole.Admin.getKey(), Status.Active)); userRoles.add(generate(UserRole.Superviser.getKey(), Status.Active)); - Collection methodsFromAuth = List.of("CS_MKR_ADMIN", "CS_MKR_SECURITY"); + Collection methodsFromAuth = List.of(UserRole.Admin.getKey(), UserRole.Security.getKey()); Collection roleActions = UserService.defineAllRoleChanges(userRoles, methodsFromAuth); assertEquals(2, roleActions.size()); @@ -49,7 +49,7 @@ class UserServiceChangeRolesTest { @Test public void testAllNew() { Collection userRoles = new ArrayList<>(); - Collection methodsFromAuth = List.of("CS_MKR_ADMIN", "CS_MKR_SUPERVISER", "CS_MKR_SECURITY", "unknownRole"); + Collection methodsFromAuth = List.of(UserRole.Admin.getKey(), UserRole.Superviser.getKey(), UserRole.Security.getKey(), "unknownRole"); Collection roleActions = UserService.defineAllRoleChanges(userRoles, methodsFromAuth); assertEquals(3, roleActions.size()); @@ -66,7 +66,7 @@ class UserServiceChangeRolesTest { Collection userRoles = new ArrayList<>(); userRoles.add(generate(UserRole.Admin.getKey(), Status.Active)); userRoles.add(generate(UserRole.Superviser.getKey(), Status.Active)); - Collection methodsFromAuth = List.of("CS_MKR_ADMIN", "CS_MKR_SUPERVISER", "CS_MKR_SECURITY", "Cs_mkr_superviser", "unknownRole"); + Collection methodsFromAuth = List.of(UserRole.Admin.getKey(), UserRole.Superviser.getKey(), UserRole.Security.getKey(), "Cs_mkr_superviser", "unknownRole"); Collection roleActions = UserService.defineAllRoleChanges(userRoles, methodsFromAuth); assertEquals(1, roleActions.size());