web-dev-qa-db-fra.com

Obtenez Spring Security Principal dans l'expression JSP EL

J'utilise Spring MVC et Spring Security version 3.0.6.RELEASE. Quelle est la façon la plus simple d'obtenir le nom d'utilisateur dans ma JSP? Ou même simplement si l'utilisateur est connecté ou non? Je peux penser à deux façons:

1. Utilisation d'un scriptlet

Utilisation d'un scriptlet comme celui-ci pour déterminer si l'utilisateur est connecté:

<%=org.springframework.security.core.context.SecurityContextHolder.getContext()
    .getAuthentication().getPrincipal().equals("anonymousUser")
    ? "false":"true"%>

Je ne suis pas un fan de l'utilisation de scriptlets, cependant, et je veux l'utiliser dans certains <c:if> tags, ce qui nécessite de le remettre en tant qu'attribut de page.

2. Utilisation de SecurityContextHolder

Je pourrais à nouveau utiliser SecurityContextHolder à partir de mon @Controller et le mettre sur le modèle. J'ai besoin de cela sur chaque page, cependant, je préfère ne pas avoir à ajouter cette logique dans chacun de mes contrôleurs.

Je soupçonne qu'il existe une façon plus propre de le faire ...

42
Jeremiah Orr

Vérifiez les balises de sécurité Spring: <sec:authentication property="principal.username" />

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/taglibs.html

Et vous pouvez vérifier si vous êtes connecté:

<sec:authorize access="isAuthenticated()"> 

au lieu de c: si

55
alephx

Je sais qu'il y a d'autres réponses dans le fil, mais aucune n'a répondu comment vous pouvez vérifier si l'utilisateur est authentifié. Je partage donc à quoi ressemble mon code.

Incluez le tag lib dans votre projet:

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

Créez ensuite un objet utilisateur dans la portée actuelle en ajoutant:

<sec:authentication var="user" property="principal" />

Ensuite, vous pouvez facilement afficher le nom d'utilisateur en l'ajoutant. N'oubliez pas que l'objet 'principal' est généralement de type chaîne, sauf si vous avez implémenté la sécurité Spring de manière à la changer en une autre classe dans votre projet:

<sec:authorize access="hasRole('ROLE_USER') and isAuthenticated()">
${user}
</sec:authorize>

J'espère que cela aide quelqu'un qui cherche à vérifier les rôles des utilisateurs.

Si vous utilisez Maven, ajoutez la balise de dépendance comme mentionné par Christian Vielma dans ce fil.

Merci!

17
Sameer Gupta

Vous pouvez utiliser comme ceci: Spring Security Tag Lib - 3.1.3.RELEASE

<sec:authentication var="principal" property="principal" />

et alors:

${principal.username}
11

J'utilisais Maven, j'ai donc dû ajouter la bibliothèque taglibs en l'ajoutant au pom.xml

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>3.1.3.RELEASE</version>
</dependency>

Puis dans mon jsp ajouté:

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

Et:

<sec:authentication property="principal" />

principal.username continuait de me donner des erreurs (c'est peut-être la façon dont j'ai créé l'objet UsernamePasswordAuthenticationToken, je ne sais pas).

9

Cela fonctionne que l'utilisateur soit connecté ou non et fonctionne lors de l'utilisation de l'authentification anonyme:

<sec:authorize access="isAuthenticated()">
    <sec:authentication property="principal.username" var="username" />
</sec:authorize>
<sec:authorize access="!isAuthenticated()">
    <sec:authentication property="principal" var="username" />
</sec:authorize>

Plus tard...

Hello ${username}
5
Neil McGuigan

Je pense que <sec:authentication property="principal.username" /> Ne fonctionnera pas toujours car le type retourné par Authentication.getPrincipal() est Object, c'est-à-dire: il pourrait s'agir d'un serDetail (pour lequel ce qui précède fonctionnera), une chaîne ou toute autre chose.

Dans le but d'afficher le nom d'utilisateur sur la page JSP, ce que je trouve plus fiable utilise ${pageContext.request.userPrincipal.name}.

Cela utilise Java.security.Principal.getName() qui retourne String.

5
gerrytan

Je suis d'accord avec alephx, j'ai même voté sa réponse.

Mais si vous avez besoin d'une autre approche, vous pouvez utiliser celle utilisée par Spring Roo.

Si vous disposez du SecurityContextHolderAwareRequestFilter, il fournit les méthodes de sécurité standard de l'API de servlet, à l'aide d'un wrapper de demande qui accède au SecurityContext.

Ce filtre est enregistré auprès de <http> tag de l'espace de noms Spring Security. Vous pouvez également l'enregistrer dans la chaîne de filtres de sécurité de FilterChainProxy (il suffit d'ajouter la référence à un bean déclaré dans votre applicationContext-security.xml)

Ensuite, vous pouvez accéder à l'API de servlet de sécurité comme le fait Roo (recherchez footer.jspx pour voir comment un lien de déconnexion conditionnel est écrit)

  <c:if test="${pageContext['request'].userPrincipal != null}">
<c:out value=" | "/>
...
5
jbbarquero

j tag est:

<%@taglib prefix="j" uri="http://Java.Sun.com/jsp/jstl/core" %>

la balise sec est:

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

Ajoutez à pom.xml:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>3.1.3.RELEASE</version>
</dependency>

Ajouter à la page:

<sec:authentication var="principal" property="principal"/>
<j:choose>
    <j:when test="${principal eq 'anonymousUser'}">
          NOT AUTHENTICATED
    </j:when>
    <j:otherwise>
          AUTHENTICATED
    </j:otherwise>
</j:choose>
3
Fatih Başar

Autant que je sache par défaut Spring Security 3.0.x installe a SecurityContextHolderRquestAwareFilter , afin que vous puissiez obtenir l'objet Authentication en appelant HttpServletRequest.getUserPrincipal(), et vous pouvez également interroger les rôles en appelant HttpServletRequest.isUserInRole().

1
gpeche

1) MA CLASSE D'UTILISATEUR PERSONNALISÉE avec mobile supplémentaire sur le terrain:

 public class SiteUser extends User {

    public SiteUser(String username, String password, Collection<? extends GrantedAuthority> authorities,
            String mobile) {
        super(username, password, true, true, true, true, authorities);
        this.mobile = mobile;
    }

    private String mobile;

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

}

2) DANS MON UserDetailsServiceImpl.Java, j'ai peuplé cet objet SiteUser personnalisé.

public SiteUser loadUserByUsername(String username)  {
        UserInfoVO userInfoVO = userDAO.getUserInfo(username);
        GrantedAuthority authority = new SimpleGrantedAuthority(userInfoVO.getRole());

        SiteUser siteUser = new SiteUser(userInfoVO.getUsername(), userInfoVO.getPassword(),
                Arrays.asList(authority), userInfoVO.getMobile());

        return siteUser;
}

) ET VU QUE J'Y ACCÉDE COMME:

<a href = "#" th: text = "$ {# httpServletRequest.userPrincipal.principal.mobile}">