Skip to content

Commit c1b3351

Browse files
makingjzheaux
authored andcommitted
Add RoleHierarchyImpl#of
Closes gh-13788
1 parent e6bea1c commit c1b3351

File tree

2 files changed

+39
-14
lines changed

2 files changed

+39
-14
lines changed

core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,17 @@ public static Builder withRolePrefix(String rolePrefix) {
125125
return new Builder(rolePrefix);
126126
}
127127

128+
/**
129+
* Create a role hierarchy instance with the given definition
130+
* @param roleHierarchyStringRepresentation String definition of the role hierarchy.
131+
* @return role hierarchy instance
132+
*/
133+
public static RoleHierarchyImpl of(String roleHierarchyStringRepresentation) {
134+
RoleHierarchyImpl hierarchy = new RoleHierarchyImpl();
135+
hierarchy.setHierarchy(roleHierarchyStringRepresentation);
136+
return hierarchy;
137+
}
138+
128139
/**
129140
* Set the role hierarchy and pre-calculate for every role the set of all reachable
130141
* roles, i.e. all roles lower in the hierarchy of every given role. Pre-calculation

core/src/test/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImplTests.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ public class RoleHierarchyImplTests {
4040
public void testRoleHierarchyWithNullOrEmptyAuthorities() {
4141
List<GrantedAuthority> authorities0 = null;
4242
List<GrantedAuthority> authorities1 = new ArrayList<>();
43-
RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl();
44-
roleHierarchyImpl.setHierarchy("ROLE_A > ROLE_B");
43+
RoleHierarchyImpl roleHierarchyImpl = RoleHierarchyImpl.of("ROLE_A > ROLE_B");
4544
assertThat(roleHierarchyImpl.getReachableGrantedAuthorities(authorities0)).isNotNull();
4645
assertThat(roleHierarchyImpl.getReachableGrantedAuthorities(authorities0)).isEmpty();
4746
assertThat(roleHierarchyImpl.getReachableGrantedAuthorities(authorities1)).isNotNull();
@@ -53,8 +52,7 @@ public void testSimpleRoleHierarchy() {
5352
List<GrantedAuthority> authorities0 = AuthorityUtils.createAuthorityList("ROLE_0");
5453
List<GrantedAuthority> authorities1 = AuthorityUtils.createAuthorityList("ROLE_A");
5554
List<GrantedAuthority> authorities2 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_B");
56-
RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl();
57-
roleHierarchyImpl.setHierarchy("ROLE_A > ROLE_B");
55+
RoleHierarchyImpl roleHierarchyImpl = RoleHierarchyImpl.of("ROLE_A > ROLE_B");
5856
assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthorities(
5957
roleHierarchyImpl.getReachableGrantedAuthorities(authorities0), authorities0))
6058
.isTrue();
@@ -72,8 +70,10 @@ public void testTransitiveRoleHierarchies() {
7270
List<GrantedAuthority> authorities2 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_B", "ROLE_C");
7371
List<GrantedAuthority> authorities3 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_B", "ROLE_C",
7472
"ROLE_D");
75-
RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl();
76-
roleHierarchyImpl.setHierarchy("ROLE_A > ROLE_B\nROLE_B > ROLE_C");
73+
RoleHierarchyImpl roleHierarchyImpl = RoleHierarchyImpl.of("""
74+
ROLE_A > ROLE_B
75+
ROLE_B > ROLE_C
76+
""");
7777
assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthorities(
7878
roleHierarchyImpl.getReachableGrantedAuthorities(authorities1), authorities2))
7979
.isTrue();
@@ -94,8 +94,13 @@ public void testComplexRoleHierarchy() {
9494
List<GrantedAuthority> authoritiesOutput3 = AuthorityUtils.createAuthorityList("ROLE_C", "ROLE_D");
9595
List<GrantedAuthority> authoritiesInput4 = AuthorityUtils.createAuthorityList("ROLE_D");
9696
List<GrantedAuthority> authoritiesOutput4 = AuthorityUtils.createAuthorityList("ROLE_D");
97-
RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl();
98-
roleHierarchyImpl.setHierarchy("ROLE_A > ROLE_B\nROLE_A > ROLE_C\nROLE_C > ROLE_D\nROLE_B > ROLE_D");
97+
RoleHierarchyImpl roleHierarchyImpl = RoleHierarchyImpl
98+
.of("""
99+
ROLE_A > ROLE_B
100+
ROLE_A > ROLE_C
101+
ROLE_C > ROLE_D
102+
ROLE_B > ROLE_D
103+
""");
99104
assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthorities(
100105
roleHierarchyImpl.getReachableGrantedAuthorities(authoritiesInput1), authoritiesOutput1))
101106
.isTrue();
@@ -138,8 +143,7 @@ public void testSimpleRoleHierarchyWithCustomGrantedAuthorityImplementation() {
138143
List<GrantedAuthority> authorities0 = HierarchicalRolesTestHelper.createAuthorityList("ROLE_0");
139144
List<GrantedAuthority> authorities1 = HierarchicalRolesTestHelper.createAuthorityList("ROLE_A");
140145
List<GrantedAuthority> authorities2 = HierarchicalRolesTestHelper.createAuthorityList("ROLE_A", "ROLE_B");
141-
RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl();
142-
roleHierarchyImpl.setHierarchy("ROLE_A > ROLE_B");
146+
RoleHierarchyImpl roleHierarchyImpl = RoleHierarchyImpl.of("ROLE_A > ROLE_B");
143147
assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthoritiesCompareByAuthorityString(
144148
roleHierarchyImpl.getReachableGrantedAuthorities(authorities0), authorities0))
145149
.isTrue();
@@ -157,12 +161,22 @@ public void testWhitespaceRoleHierarchies() {
157161
List<GrantedAuthority> authorities2 = AuthorityUtils.createAuthorityList("ROLE A", "ROLE B", "ROLE>C");
158162
List<GrantedAuthority> authorities3 = AuthorityUtils.createAuthorityList("ROLE A", "ROLE B", "ROLE>C",
159163
"ROLE D");
160-
RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl();
161-
roleHierarchyImpl.setHierarchy("ROLE A > ROLE B\nROLE B > ROLE>C");
164+
RoleHierarchyImpl roleHierarchyImpl = RoleHierarchyImpl.of("""
165+
ROLE A > ROLE B
166+
ROLE B > ROLE>C
167+
""");
162168
assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthorities(
163169
roleHierarchyImpl.getReachableGrantedAuthorities(authorities1), authorities2))
164170
.isTrue();
165171
roleHierarchyImpl.setHierarchy("ROLE A > ROLE B\nROLE B > ROLE>C\nROLE>C > ROLE D");
172+
assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthorities(
173+
roleHierarchyImpl.getReachableGrantedAuthorities(authorities1), authorities2))
174+
.isTrue();
175+
roleHierarchyImpl.setHierarchy("""
176+
ROLE A > ROLE B
177+
ROLE B > ROLE>C
178+
ROLE>C > ROLE D
179+
""");
166180
assertThat(HierarchicalRolesTestHelper.containTheSameGrantedAuthorities(
167181
roleHierarchyImpl.getReachableGrantedAuthorities(authorities1), authorities3))
168182
.isTrue();
@@ -200,8 +214,8 @@ public void singleLineLargeHierarchy() {
200214
List<GrantedAuthority> flatAuthorities = AuthorityUtils.createAuthorityList("ROLE_HIGHEST");
201215
List<GrantedAuthority> allAuthorities = AuthorityUtils.createAuthorityList("ROLE_HIGHEST", "ROLE_HIGHER",
202216
"ROLE_LOW", "ROLE_LOWER");
203-
RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl();
204-
roleHierarchyImpl.setHierarchy("ROLE_HIGHEST > ROLE_HIGHER > ROLE_LOW > ROLE_LOWER");
217+
RoleHierarchyImpl roleHierarchyImpl = RoleHierarchyImpl
218+
.of("ROLE_HIGHEST > ROLE_HIGHER > ROLE_LOW > ROLE_LOWER");
205219
assertThat(roleHierarchyImpl.getReachableGrantedAuthorities(flatAuthorities))
206220
.containsExactlyInAnyOrderElementsOf(allAuthorities);
207221
}

0 commit comments

Comments
 (0)