Je souhaite afficher le contenu à tout utilisateur connecté et masquer s'il n'est pas connecté. J'utilise jsp et Spring Security.
De toute évidence, une solution maison est facilement faite. Mais quel est le moyen standard le plus propre pour y parvenir?
Les étiquettes de sécurité de Spring ne semblent pas avoir la bonne manière de permettre l’ajout de nouveaux rôles dans le futur.
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>
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. En cela, vous pouvez 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? - compatible 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:
<%@ 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 cette ...
<%
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 ...
-un J
vous pouvez utiliser cette étiquette de sécurité à l'intérieur jsp spring
request.getUserPrincipal().getName()