custom spring spring-security acl

custom - Implementación de funciones jerárquicas en Spring Security



spring security roles (2)

Intenta agregar esto a spring-security.xml :

<http auto-config="true" use-expressions="true" access-decision-manager-ref="accessDecisionManager"> <beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> <beans:constructor-arg> <beans:list> <beans:ref bean="roleVoter" /> </beans:list> </beans:constructor-arg> </beans:bean>

Estoy tratando de implementar roles Jerárquicos en la seguridad de Spring y agregué la siguiente configuración en mis archivos xml según la fuente de la documentación de Spring.

<bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl"> <property name="hierarchy"> <value> ROLE_ADMIN > ROLE_PRO ROLE_PRO > ROLE_PREMIUM ROLE_PREMIUM > ROLE_BASIC ROLE_BASIC > ROLE_ANONYMOUS </value> </property> </bean> <bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter"> <constructor-arg ref="roleHierarchy"/> </bean>

Lo he intentado con las líneas anteriores, pero obtengo la denegación de acceso mientras ROLE_ADMIN intenta acceder a la URL asignada a ROLE_BASIC. ¿Debo agregar algo más que esto? No encontré nada más que esas líneas en el sitio de Spring. Además, si conoce alguna buena implementación de funciones jerárquicas, hágalo.


Creo que debes registrar roleVoter en accessDecisionManager . @Ver esta respuesta para un ejemplo.

Pero para ser honesto, dudo del concepto de Votar Jerárquico de Primavera , porque necesita agregar un votante jerárquico especial en todas partes. Personalmente, prefiero otra forma: he implementado un JdbcDaoImpl personalizado que anula las addCustomAuthorities y agrega Roles "normales" al "existente" una vez.

/** * Extension of {@link JdbcDaoImpl} User Detail Provider, so that is uses the * {@link PrivilegesService} to extend the provided Authorities. * */ public class JdbcDaoPrivilegesImpl extends JdbcDaoImpl { private PrivilegesService privilegesService; public JdbcDaoPrivilegesImpl(final PrivilegesService privilegesService) { this.privilegesService = privilegesService; } @Override protected void addCustomAuthorities(String username, List<GrantedAuthority> authorities) { super.addCustomAuthorities(username, authorities); List<GrantedAuthority> privileges = new ArrayList<GrantedAuthority>(); for (GrantedAuthority role : authorities) { privileges.addAll(privilegesService.getPrivilegesForRole(role)); } authorities.addAll(privileges); } } public interface PrivilegesService { Collection<? extends GrantedAuthority> getPrivilegesForRole(GrantedAuthority role); } public class PropertyPrivilegesServiceImpl implements PrivilegesService { /** * Property bases mapping of roles to privileges. * Every role is one line, the privileges are comma separated. */ private Properties roleToPrivileges; public PropertyPrivilegesServiceImpl(Properties roleToPrivileges) { if (roleToPrivileges == null) { throw new IllegalArgumentException("roleToPrivileges must not be null"); } this.roleToPrivileges = roleToPrivileges; } @Override public Collection<? extends GrantedAuthority> getPrivilegesForRole(GrantedAuthority role) { if (roleToPrivileges == null) { throw new IllegalArgumentException("role must not be null"); } String authority = role.getAuthority(); if(authority != null) { String commaSeparatedPrivileges = roleToPrivileges.getProperty(role.getAuthority()); if (commaSeparatedPrivileges != null) { List<GrantedAuthority> privileges = new ArrayList<GrantedAuthority>(); for(String privilegeName : StringUtils.commaDelimitedListToSet(commaSeparatedPrivileges)) { privileges.add(new GrantedAuthorityImpl(privilegeName.trim())); } return privileges; } else { return Collections.emptyList(); } } else { return Collections.emptyList(); } } }

Config de ejemplo

<bean id="myUserDetailsService" class="JdbcDaoForUpdatableUsernames"> <constructor-arg ref="propertyPrivilegesService"/> <property name="dataSource" ref="dataSource"/> <property name="usersByUsernameQuery" value="SELECT login,encryptedPassword,loginEnabled FROM user WHERE login = ?"/> <property name="enableAuthorities" value="true"/> <property name="authoritiesByUsernameQuery" value="SELECT u.login, r.securityRoles FROM user u, user2security_roles r WHERE u.login= ? AND u.id = r. User_fk;"/> </bean> <bean id="propertyPrivilegesService" class="PropertyPrivilegesServiceImpl"> <constructor-arg> <props> <prop key="ROLE_ADMIN"> ROLE_PREMIUM, ROLE_BASIC </prop> <prop key="ROLE_PREMIUM"> RROLE_BASIC </prop> </props> </constructor-arg> </bean>