Spring Security JSP Taglib

La tecnología o framework de seguridad Spring Security cuenta con taglib que nos proveen acceso a la información de seguridad del los usuarios y posibilitan el poder filtrar el contenido que se muestra al usuario en base a sus privilegios o tipo de usuario del que se trate, debemos agregar la siguiente dependencia: spring-security-taglibs.

Para ejemplificar los que podemos lograr, crearemos una pequeña aplicación que mostrará el nombre y roles del usuario actual, además mostrará una vista en donde un usuario con el rol de administrador podrá manipular los datos de dicha vista, borrar, agregar, editar, etc., si el usuario no tiene los privilegios solo podrá visualizar los datos.

Dependencias requeridas, editamos el archivo pom.xml:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${security.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${security.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${security.version}</version>
</dependency>

Declaramos el taglib en el archivo JSP de la siguiente manera:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

La etiqueta authorize nos sirve para filtrar el contenido que se mostrará en base a los privilegios del usuario, por ejemplo, podemos definir un contenido que solo será mostrado a aquellos usuarios con privilegios de administrador, esta etiqueta la utilizaremos de la siguiente manera:

<sec:authorize access="hasRole('ROLE_ADMIN')">
    Este contenido se muestra si el usuario tiene el privilegio: <b>ROLE_ADMIN</b>.
</sec:authorize>

Estableciendo el atributo access="isAuthenticated()" mostraremos contenido a todos los usuarios autenticados, la expresión puede ser mas compleja si utilizamos SpEL, por ejemplo, la expresión: access="isAuthenticated() and principal.username == 'jesus'".

Otra forma de usar esta etiqueta es indicando el atributo url, por medio del mismo, el contenido será generado si el usuario actual tiene permiso para acceder a la URL indicada.

<sec:authorize url="/user/delete">
    
</sec:authorize>

Si deseamos obtener el nombre del usuario y sus roles, usaremos las siguientes etiquetas:

<sec:authentication property="principal.username" />
<sec:authentication property="principal.authorities" />

Otra cosa que podemos hacer, es agregar fácilmente el Token CSRF para evitar este tipo de ataques, si deseamos proteger nuestro formulario debemos agregar la etiqueta <sec:csrfInput /> al mismo, ejemplo:

<form method="post" action="/do/something">

   <sec:csrfInput />

   Name:<br />
   <input type="text" name="name" />
    ...
</form>

Tutorial Spring Security Taglib

Ahora podemos aplicar lo que hemos aprendido, seguimos programando sobre la aplicación que desarrollamos desde el principio de la serie de tutoriales Spring Security, anteriormente añadimos el formulario de registro, ahora trabajaremos en la página que nos permitirá borrar a un usuario de la base de datos, esta acción esta permitida solo para usuarios administradores.

Esta es la vista para un usuario administrador.

image

Si el usuario no tiene los permisos adecuados, verá esto:

image

Ambas vistas son generadas por el mismo archivo JSP, solo que el contenido es filtrado usando lo explicado anteriormente.

<%@ page contentType="text/html" pageEncoding="UTF-8" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="stylesheet" type="text/css" href="../static/bootstrap/css/bootstrap.min.css" />
        <link rel="stylesheet" type="text/css" href="../static/font-awesome/css/font-awesome.css" />
        <title>User List</title>
    </head>
    <body>

        <div class="container">   

            <div class="row">
                <h1 style="margin: 40px 20px">Listado de usuarios registrados</h1>
            </div>

            <c:url value="/user/delete" var="deleteUrl"/>

            <table class="table table-striped">
                <tr>
                    <th>Nombre</th>
                    <th>Apellido</th>
                    <th>Email</th>
                    <th>Roles</th>

                    <sec:authorize url="/user/delete">
                        <th>Eliminar</th>
                    </sec:authorize>
                </tr>

                <c:forEach var="user" 
                           items="${userList}"
                           varStatus="status">
                    <tr>
                        <td>${user.nombre}</td>
                        <td>${user.apellido}</td>
                        <td>${user.email}</td>
                        <td>${user.roles}</td>

                        <sec:authorize access="hasRole('ROLE_ADMIN')">
                            <td style="text-align: center;">
                                <a class="fa fa-1x fa-trash" href="${deleteUrl}/${user.id}"></a>
                            </td>
                        </sec:authorize>

                    </tr>
                </c:forEach>
            </table>


            <c:url value="/logout" var="logoutUrl"/>

            <footer style="border: gray solid 1px; border-radius: 5px; padding: 10px;">
                <div style="font-family: monospace; text-align: center; margin: auto;">

                    Usuario: <sec:authentication property="principal.username" /> |
                    Roles: <sec:authentication property="principal.authorities" /> |

                    <form action="${logoutUrl}" method="post" style="display: inline-block;">
                        <input type="submit" value="logout"/>
                        <sec:csrfInput />
                    </form>

                    <p>Tutor de Programación 2017</p>           
                </div>
            </footer>

        </div>
    </body>
</html>

Para probar la aplicación recuerda primero registrar a los usuarios, es todo de momento.

Descargar proyecto: spring-security-taglib.zip

Comentarios

Temas relacionados

Entradas populares de este blog

tkinter Grid

Controles y Contenedores JavaFX 8 - I

Conectar SQL Server con Java

tkinter Canvas