el papel y el permiso en la seguridad de primavera 3

Soy nuevo en ss3, y he leído su referencia, también leí el libro de seguridad de primavera.

Sin embargo, no encuentro nada sobre el permiso de rol.

Por ejemplo, aquí está la configuración para la autenticación basada en formularios.

  <http auto-config='true'>
    <intercept-url pattern="/user/add/**" access="hasRole('USER_ADMIN')"/>
    <intercept-url pattern="/user/delete/**" access="hasRole('USER_ADMIN')"/>
    <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page='/login.jsp'/>
  </http>

Quiero controlar la operación del usuario (agregar / eliminar):

<intercept-url pattern="/user/add/**" access="hasRole('USER_ADMIN')"/>
<intercept-url pattern="/user/delete/**" access="hasRole('USER_ADMIN')"/>

Defino el rol de 'USER_ADMIN', pero esto no es suficiente, ya que quiero diferenciar al usuario que tiene permiso de 'agregar' del usuario que tiene permiso de 'eliminar'.

Tal vez pueda agregar más roles como 'user_admin_add' y 'user_admin_delete'.

Pero no creo que esto sea una buena idea ya que 'agregar' o 'eliminar' son permisos, no roles.

¿Como hacerlo?

Además, parece que todos los roles deberían estar confi gurados en el archivo xml, me pregunto si puedo agregar nuevos roles y permisos dinámicamente (en la página del administrador).

preguntado el 08 de noviembre de 11 a las 13:11

4 Respuestas

Tal vez pueda agregar más roles como 'user_admin_add' y 'user_admin_delete'.

Esta es la forma. Los permisos son roles y generalmente hay personas que ven la diferenciación entre ellos como innecesaria.

No creo que haya mucha diferencia en tener un rol ROLE_USER_ADDER o un permiso PERMISSION_ADD_USERS.

Sin embargo, puede utilizar roles como concepto para agrupar permisos si es necesario. Por ejemplo, puede tener un rol de administrador que puede agregar y eliminar usuarios. Entonces el papel ROLE_ADMIN tendrá PERMISSION_ADD_USER y PERMISSION_REMOVE_USER. Aún así, la primavera verá tanto los roles como los permisos simplemente como autoridades.

En cuanto a la adición de roles dinámicos, puede hacerlo cargando el permiso de usuario actual desde su base de datos, por ejemplo. Eche un vistazo al UserDetailsService de seguridad de primavera. los UserDetails objeto que devuelve tiene un getAuthorities() método que puede completar desde su base de datos.

/**
 * Returns the authorities granted to the user. Cannot return <code>null</code>.
 *
 * @return the authorities, sorted by natural key (never <code>null</code>)
 */
Collection<GrantedAuthority> getAuthorities();

Aquí es un muy buen ejemplo de cómo implementar su propio UserDetailsService.

respondido 08 nov., 11:18

Piense en los roles como privilegios. Y granula todo lo que necesites. Otra cosa es que quizás debas hacer una implementación más RESTFul. Pero este es otro hilo.

Por ejemplo, su "eliminación" podría ser un método HTTP "DELETE". Entonces podrías ser:

<security:intercept-url pattern="/users/*" method="DELETE" access="ROLE_DELETE_USER" />

y un curl -X DELETE -u login:password 'http://example.com/users/1'

eliminaría el user con id 1.

Por un RESTFul, dado que los uris son identificadores o acciones, no tiene sentido agregar roles (privilegios) dinámicamente. Dado que esos roles están destinados a usarse contra un nuevo recurso que debería contener el archivo xml.

Me temo que no puede hacer esto, a menos que use ** comodines. Lo cual, en mi opinión, si se usa sin cuidado puede provocar problemas.

respondido 08 nov., 11:18

más implementación RESTFul? ¿puedes darme mas detalles? Estoy interesado. :) Por cierto, ¿qué tal agregar roles dinámicamente? - hguser

agregar roles dinámicamente? No entiendo lo siento. - ssedano

Pero en la página html, ¿cómo construir el enlace '/ user / 1' para usar el método de eliminación http? - hguser

Por agregar roles dinámicamente me refiero a que el administrador del sistema puede agregar más roles usando la página. Puedo agregar fácilmente estos roles a la base de datos, pero ¿cómo puedo agregarlos en el xml de configuración de ss? - hguser

@hguser Quieres tener roles dinámicos y definirlos en el archivo de configuración de seguridad? - Simeón

En mi opinión personal, Spring Security tiene varios (digamos) nombres elegidos por desgracia. Así que no prestes tanta atención al Término "Rol", funciona perfectamente si lo usas para privilegios.

En mis aplicaciones, uso una convención de nomenclatura para elegir entre roles y privilegios. (los roles se escriben en mayúsculas, los privilegios en minúsculas). Pero preste atención, el votante de rol prestará atención solo a las cadenas que comienzan con "ROLE" (la configuración predeterminada se puede cambiar).

Véase también Autorización basada en el grupo de seguridad de Spring

contestado el 23 de mayo de 17 a las 15:05

Debería pensar en roles más en la línea de, bueno, roles, en lugar de permisos. Si desea diferenciar entre agregar y eliminar usuarios, puede definir roles descritos como ROLE_SALES y ROLE_USER_ADMIN. Es posible que el personal de ventas necesite poder agregar nuevos usuarios a un sistema.

Con respecto a la aplicación dinámica de roles, debe mirar la arquitectura de Spring Security. Lo más probable es que desee utilizar o implementar un UserDetailsService. Consulte la Documentación de referencia de UserDetailsService.

Si está almacenando su información de autorización de usuario en una base de datos JDBC, por ejemplo, es posible que desee utilizar el JdbcDaoImpl.

Hay algunos ejemplos de uso de diferentes proveedores de autenticación en el introducción al espacio de nombres.

respondido 08 nov., 11:18

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.