comment afficher de manière conditionnelle le contenu jsp aux utilisateurs connectés avec la sécurité Spring
-
08-07-2019 - |
Question
Je souhaite afficher le contenu d'un utilisateur connecté et le masquer s'il ne l'est pas. J'utilise jsp et Spring Security.
De toute évidence, une solution maison est facile à mettre en place. Mais quel est le moyen standard le plus propre pour y parvenir?
Les balises de sécurité de Spring ne semblent pas avoir un moyen agréable de permettre l'ajout de nouveaux rôles dans le futur.
La solution
J'ai eu du succès avec ce qui suit:
<sec:authorize ifAnyGranted="ROLE_ANONYMOUS">
<td><a href="<c:url value="/login.htm"/>">Login</a></td>
</sec:authorize>
<sec:authorize ifNotGranted="ROLE_ANONYMOUS">
<td><a href="<c:url value="/j_spring_security_logout"/>">Logout</a></td>
</sec:authorize>
De nouveaux rôles peuvent être ajoutés sans affecter la logique ici.
Pour mettre cette réponse à jour avec Spring Security 3, l'utilisation des expressions isAnonymous()
et isAuthenticated()
a bien fonctionné jusqu'à présent pour obtenir le même résultat. Voici un exemple:
<sec:authorize access="isAnonymous()">
<form method="POST" action="<c:url value='j_spring_security_check'/>">
Username: <input name="j_username" type="text" value="${SPRING_SECURITY_LAST_USERNAME}" />
Password: <input name="j_password" type="password" />
<input type="submit" value="Sign in" />
</form>
</sec:authorize>
<sec:authorize access="isAuthenticated()">
<a href="<c:url value="/j_spring_security_logout" />">Logout</a>
</sec:authorize>
Autres conseils
La version actuelle (3.1 peut-être même plus tôt) supporte les paramètres var pour enregistrer le résultat dans un attribut. Vous pouvez ainsi coder ce qui suit:
<sec:authorize var="loggedIn" access="isAuthenticated()" />
<c:choose>
<c:when test="${loggedIn}">
You are loged in
</c:when>
<c:otherwise>
You are logged out
</c:otherwise>
</c:choose>
Vous pouvez utiliser Spring EL dans la balise <sec:authorize />
, comme ceci:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<sec:authorize access="isAuthenticated()">
YES, you are logged in!
</sec:authorize>
Comment ça? - conforme à Spring 2.5 ;-)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
<security:authorize ifAllGranted="ROLE_USER">
Welcome <%= request.getUserPrincipal().getName() %>
<a href="<c:url value="/j_spring_security_logout"/>">Logout</a><br/>
</security:authorize>
Que diriez-vous de:
<%@ taglib uri="http://acegisecurity.org/authz" prefix="authz" %>
<c:set var="authenticated" value="${false}"/>
<authz:authorize ifAllGranted="ROLE_USER">
<c:set var="authenticated" value="${true}"/>
</authz:authorize>
<c:if test="${authenticated}">
<!-- your secure content here -->
</c:if>
le plus simple que j'ai utilisé pour coder ceci ...
<%
if (request.getRemoteUser()== null) {%>
<!-- put public-only information-->
<%}%>
Voici comment je le fais:
<%@ page import="org.springframework.security.context.SecurityContextHolder" %>
<c:if test="<%=SecurityContextHolder.getContext().getAuthentication() != null %>">
<!-- your secure content here -->
</c:if>
Faites-moi savoir si cela fonctionne pour vous aussi ...
-aj
vous pouvez utiliser cette balise de sécurité à l'intérieur du ressort jsp
request.getUserPrincipal().getName()