Saltar al contenido

Spring Security con roles y permisos

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:

  1. Cree su modelo (usuario, rol, permisos) y una forma de recuperar permisos para un usuario determinado;
  2. Define el tuyo org.springframework.security.authentication.ProviderManager y configurarlo (establecer sus proveedores) a un personalizado org.springframework.security.authentication.AuthenticationProvider. Este último debe devolver en su método de autenticación una Autenticación, que debe configurarse con el org.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:

  1. Utilice un proveedor de autenticación personalizado

    <bean id="myAuthenticationProvider" class="myProviderImplementation" scope="singleton">
    ...
    </bean>
    

  2. Haga que su proveedor personalizado devuelva una UserDetails implementación. Esta UserDetailsImpl tendrá un getAuthorities() 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *