From 6adbe8dae0adf8582fa9fb2aef00dae7c0bb3ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B2=BD=EC=9A=B1?= Date: Fri, 13 Apr 2018 12:53:13 +0900 Subject: [PATCH] Support whitespace characters using RoleHierarchyImpl --- .../hierarchicalroles/RoleHierarchyImpl.java | 53 +++++++++---------- .../RoleHierarchyImplTests.java | 23 ++++++++ 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImpl.java b/core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImpl.java index 417ebc618f..a85adb03cd 100755 --- a/core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImpl.java +++ b/core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImpl.java @@ -15,6 +15,9 @@ */ package org.springframework.security.access.hierarchicalroles; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -22,12 +25,9 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -176,32 +176,31 @@ public class RoleHierarchyImpl implements RoleHierarchy { * will become a key that references a set of the reachable lower roles. */ private void buildRolesReachableInOneStepMap() { - Pattern pattern = Pattern.compile("(\\s*([^\\s>]+)\\s*>\\s*([^\\s>]+))"); - - Matcher roleHierarchyMatcher = pattern - .matcher(this.roleHierarchyStringRepresentation); this.rolesReachableInOneStepMap = new HashMap>(); - - while (roleHierarchyMatcher.find()) { - GrantedAuthority higherRole = new SimpleGrantedAuthority( - roleHierarchyMatcher.group(2)); - GrantedAuthority lowerRole = new SimpleGrantedAuthority( - roleHierarchyMatcher.group(3)); - Set rolesReachableInOneStepSet; - - if (!this.rolesReachableInOneStepMap.containsKey(higherRole)) { - rolesReachableInOneStepSet = new HashSet<>(); - this.rolesReachableInOneStepMap.put(higherRole, - rolesReachableInOneStepSet); + try (BufferedReader bufferedReader = new BufferedReader( + new StringReader(this.roleHierarchyStringRepresentation))) { + for (String readLine; (readLine = bufferedReader.readLine()) != null;) { + String[] roles = readLine.split(" > "); + for (int i = 1; i < roles.length; i++) { + GrantedAuthority higherRole = new SimpleGrantedAuthority( + roles[i - 1].replaceAll("^\\s+|\\s+$", "")); + GrantedAuthority lowerRole = new SimpleGrantedAuthority(roles[i].replaceAll("^\\s+|\\s+$", "")); + Set rolesReachableInOneStepSet; + if (!this.rolesReachableInOneStepMap.containsKey(higherRole)) { + rolesReachableInOneStepSet = new HashSet(); + this.rolesReachableInOneStepMap.put(higherRole, rolesReachableInOneStepSet); + } else { + rolesReachableInOneStepSet = this.rolesReachableInOneStepMap.get(higherRole); + } + addReachableRoles(rolesReachableInOneStepSet, lowerRole); + if (logger.isDebugEnabled()) { + logger.debug("buildRolesReachableInOneStepMap() - From role " + higherRole + + " one can reach role " + lowerRole + " in one step."); + } + } } - else { - rolesReachableInOneStepSet = this.rolesReachableInOneStepMap - .get(higherRole); - } - addReachableRoles(rolesReachableInOneStepSet, lowerRole); - - logger.debug("buildRolesReachableInOneStepMap() - From role " + higherRole - + " one can reach role " + lowerRole + " in one step."); + } catch (IOException e) { + throw new IllegalStateException(e); } } diff --git a/core/src/test/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImplTests.java b/core/src/test/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImplTests.java index 2e29b73529..2b9ca78b7a 100644 --- a/core/src/test/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImplTests.java +++ b/core/src/test/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImplTests.java @@ -210,4 +210,27 @@ public class RoleHierarchyImplTests { roleHierarchyImpl.getReachableGrantedAuthorities(authorities2), authorities2)).isTrue(); } + + @Test + public void testWhitespaceRoleHierarchies() { + List authorities1 = AuthorityUtils.createAuthorityList( + "ROLE A"); + List authorities2 = AuthorityUtils.createAuthorityList("ROLE A", + "ROLE B", "ROLE>C"); + List authorities3 = AuthorityUtils.createAuthorityList("ROLE A", + "ROLE B", "ROLE>C", "ROLE D"); + + RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl(); + + roleHierarchyImpl.setHierarchy("ROLE A > ROLE B\nROLE B > ROLE>C"); + assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthorities( + roleHierarchyImpl.getReachableGrantedAuthorities(authorities1), + authorities2)).isTrue(); + + roleHierarchyImpl.setHierarchy( + "ROLE A > ROLE B\nROLE B > ROLE>C\nROLE>C > ROLE D"); + assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthorities( + roleHierarchyImpl.getReachableGrantedAuthorities(authorities1), + authorities3)).isTrue(); + } }