Pregunta

Estoy tratando de hacer un simple foro sólo para conseguir la caída de los marcos de Primavera de seguridad y MVC.

Para simplificar, vamos Tengo un JSP para ver un mensaje en el foro, que se parece a lo siguiente:

<body>
    ...

    Title: ${forumPost.title} <br>
    Author: ${forumPost.author.name} <br>
    Message: {forumPost.message} <br>

    <security:authorize ifAnyGranted="ROLE_ADMIN">
        Edit: <a href="/edit">Edit</a>
    </security:authorize>

    ...
</body>

Mi problema es: no sólo debe ser un administrador capaz de editar este post, pero el autor original debe ser capaz también. Por lo tanto, sólo quiero ROLE_ADMIN y el autor original para poder ver el enlace Editar. Sin embargo no estoy seguro de cómo filtrar por el usuario con el seguridad:. Autorizar etiqueta, o si voy a tener que ir sobre esto de una manera diferente

Cualquier sugerencia sería muy apreciada. Gracias!

¿Fue útil?

Solución

Si se asume que tiene un controlador que se encuentra detrás de esta página, yo simplemente agregar un campo canEditPost a la ModelAndView que se ve algo como (semi-pseudocódigo):

private boolean isAdmin() {
    Authentication currentAuthObj = SecurityContextHolder.getContext().getAuthentication();
    List<GrantedAuthority> authorities = Arrays.asList(currentAuthObj.getAuthorites());
    for (GrantedAuthority auth : authorities) {
        if ("ROLE_ADMIN".equals(auth.getAuthority())) {
            return true;
        }
    }
    return false;
}

boolean currentUserIsAuthor = ...;

modelAndView.addObject("canEditPost", 
    Boolean.valueOf(currentUserIsAuthor || isAdmin());

Y a continuación, en su opinión, simplemente hacer referencia a $ canEditPost.

Por lo general es mejor para el fin de simplemente hacer referencia a una simple bandera en el modelo que tiene la vista / plantilla haciendo la lógica real.

Otros consejos

¿Su objeto Author implementar equals de tal manera que cada autor es único?

Si es así, simplemente podría comprobar si el Author es el mismo que el usuario actual (Tendrías dos conjuntos de etiquetas).

puede tener condiciones

<% if(mycondition.isTrue()){ %>
<security:authorize ifAnyGranted="ROLE_ADMIN">
    Edit: <a href="/edit">Edit</a>
</security:author
<% }%>

@ Matt respuesta de b es una gran manera de hacerlo y es probablemente lo que voy a terminar haciendo. Sin embargo, he encontrado otra manera que sea un poco más complicado, pero logrará lo que he puesto en este post.

Hice un poco de lectura y descubrí que se puede manejar la seguridad a nivel de objeto de dominio y, esencialmente, daría acceso de lectura / escritura / eliminar privilegios a una función oa un objeto arbitrario, por ejemplo, el ID de usuario actual. En este ejemplo, le daría el acceso actual id de usuario a un objeto de dominio, en este caso un objeto ForoPon que tiene su propio identificador único de la base de datos.

El ID de usuario actual entonces se le conceda acceso de lectura y escritura, que puede (a través de la configuración XML) se define como una función personalizada de tipo (creo que el término correcto es en realidad el votante). entonces yo podría llamar a este elector MESSAGE__EDIT .

Por lo tanto, en mi JSP pude utilizar el siguiente:

seguridad: autorizar ifAnyGranted = "MESSAGE_EDIT"

Y lo haría (de nuevo, a través de la configuración de XML) obtener el identificador de usuario actual y dar acceso basado en el objeto de dominio actual, en este caso, un objeto ForoPon.

Es un poco justo más trabajo de lo que parece, pero sin duda se puede hacer.

Algunos documentación sobre todo esto se puede encontrar en la sección de seguridad de objetos de dominio en la documentación de la primavera de Seguridad de referencia ( http://static.springframework.org/spring-security/site/reference/html/springsecurity.html (por alguna razón el enlace a la sección de dominio objeto de seguridad es roto por ahora)).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top