Solución:
Soy el autor del artículo en cuestión.
Sin duda, hay varias formas de hacerlo, pero la forma en que normalmente lo hago es implementar un UserDetails
que sabe sobre roles y permisos. Role
y Permission
son solo clases personalizadas que escribes. (Nada sofisticado–Role
tiene un nombre y un conjunto de Permission
instancias, y Permission
tiene un nombre.) Entonces el getAuthorities()
devoluciones GrantedAuthority
objetos que se ven así:
PERM_CREATE_POST
, PERM_UPDATE_POST
, PERM_READ_POST
en lugar de devolver cosas como
ROLE_USER
, ROLE_MODERATOR
Los roles todavía están disponibles si su UserDetails
la implementación tiene un getRoles()
método. (Recomiendo tener uno).
Lo ideal es que asigne roles al usuario y los permisos asociados se completen automáticamente. Esto implicaría tener una UserDetailsService
que sabe cómo realizar ese mapeo, y todo lo que tiene que hacer es obtener el mapeo de la base de datos. (Consulte el artículo para conocer el esquema).
Luego, puede definir sus reglas de autorización en términos de permisos en lugar de roles.
Espero que ayude.
Para implementar eso, parece que tienes que:
- Cree su modelo (usuario, rol, permisos) y una forma de recuperar permisos para un usuario determinado;
- Define el tuyo
org.springframework.security.authentication.ProviderManager
y configurarlo (establecer sus proveedores) a un personalizadoorg.springframework.security.authentication.AuthenticationProvider
. Este último debe devolver en su método de autenticación una Autenticación, que debe configurarse con elorg.springframework.security.core.GrantedAuthority
, en su caso, todos los permisos para el usuario dado.
El truco en ese artículo es tener roles asignados a los usuarios, pero establecer los permisos para esos roles en el Authentication.authorities
objeto.
Para eso, le aconsejo que lea la API y vea si puede extender algunos ProviderManager y AuthenticationProvider básicos en lugar de implementar todo. He hecho eso con org.springframework.security.ldap.authentication.LdapAuthenticationProvider
configurar un LdapAuthoritiesPopulator personalizado, que recuperaría los roles correctos para el usuario.
Espero que esta vez tenga lo que estás buscando. Buena suerte.
Los pasos básicos son:
-
Utilice un proveedor de autenticación personalizado
<bean id="myAuthenticationProvider" class="myProviderImplementation" scope="singleton"> ... </bean>
-
Haga que su proveedor personalizado devuelva una
UserDetails
implementación. EstaUserDetailsImpl
tendrá ungetAuthorities()
como esto:public Collection<GrantedAuthority> getAuthorities() { List<GrantedAuthority> permissions = new ArrayList<GrantedAuthority>(); for (GrantedAuthority role: roles) { permissions.addAll(getPermissionsIncludedInRole(role)); } return permissions; }
Por supuesto, desde aquí puede aplicar muchas optimizaciones / personalizaciones para sus requisitos específicos.