diff --git a/core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyAuthoritiesMapper.java b/core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyAuthoritiesMapper.java new file mode 100644 index 0000000000..862a07406b --- /dev/null +++ b/core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyAuthoritiesMapper.java @@ -0,0 +1,21 @@ +package org.springframework.security.access.hierarchicalroles; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; + +import java.util.*; + +/** + * @author Luke Taylor + */ +public class RoleHierarchyAuthoritiesMapper implements GrantedAuthoritiesMapper { + private final RoleHierarchy roleHierarchy; + + public RoleHierarchyAuthoritiesMapper(RoleHierarchy roleHierarchy) { + this.roleHierarchy = roleHierarchy; + } + + public Collection mapAuthorities(Collection authorities) { + return roleHierarchy.getReachableGrantedAuthorities(authorities); + } +} diff --git a/core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsServiceWrapper.java b/core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsServiceWrapper.java index 01aef30e30..d4b18bc57d 100755 --- a/core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsServiceWrapper.java +++ b/core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsServiceWrapper.java @@ -23,8 +23,8 @@ import org.springframework.security.core.userdetails.UserDetailsService; * instead of only the directly assigned authorities. * * @author Michael Mayr - * @deprecated use a {@code RoleHierarchyVoter} instead of populating the user Authentication object - * with the additional authorities. + * @deprecated use a {@code RoleHierarchyVoter} or use a {@code RoleHierarchyAuthoritiesMapper} to populate the + * Authentication object with the additional authorities. */ public class UserDetailsServiceWrapper implements UserDetailsService { diff --git a/core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsWrapper.java b/core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsWrapper.java index 6742f49c46..6d0c226d3d 100755 --- a/core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsWrapper.java +++ b/core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsWrapper.java @@ -26,7 +26,7 @@ import org.springframework.security.core.userdetails.UserDetails; * delegated to the UserDetails implementation. * * @author Michael Mayr - * @deprecated use a {@link RoleHierarchyVoter} instead. + * @deprecated use a {@link RoleHierarchyVoter} or {@code RoleHierarchyAuthoritiesMapper} instead. */ public class UserDetailsWrapper implements UserDetails { diff --git a/core/src/test/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyAuthoritiesMapperTests.java b/core/src/test/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyAuthoritiesMapperTests.java new file mode 100644 index 0000000000..6db811a24b --- /dev/null +++ b/core/src/test/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyAuthoritiesMapperTests.java @@ -0,0 +1,33 @@ +package org.springframework.security.access.hierarchicalroles; + +import static junit.framework.Assert.assertEquals; + +import org.junit.*; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; + +import java.util.*; + +/** + * @author Luke Taylor + */ +public class RoleHierarchyAuthoritiesMapperTests { + + @Test + public void expectedAuthoritiesAreReturned() { + RoleHierarchyImpl rh = new RoleHierarchyImpl(); + rh.setHierarchy("ROLE_A > ROLE_B\nROLE_B > ROLE_C"); + RoleHierarchyAuthoritiesMapper mapper = new RoleHierarchyAuthoritiesMapper(rh); + + Collection authorities = + mapper.mapAuthorities(AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_D")); + + assertEquals(4, authorities.size()); + + mapper = new RoleHierarchyAuthoritiesMapper(new NullRoleHierarchy()); + + authorities = mapper.mapAuthorities(AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_D")); + + assertEquals(2, authorities.size()); + } +}