在JSP EL表达式中获取Spring Security Principal

时间:2012-01-28 21:57:39

标签: java spring jsp spring-mvc spring-security

我正在使用Spring MVC和Spring Security 3.0.6.RELEASE。在JSP中获取用户名的最简单方法是什么?或者甚至只是用户是否登录?我可以想到几个方面:

1。使用scriptlet

使用这样的scriptlet来确定用户是否已登录:

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

我不喜欢使用scriptlet,我想在一些<c:if>标签中使用它,这需要将其作为页面属性放回。

2。使用SecurityContextHolder

我可以再次使用我的@Controller中的SecurityContextHolder并将其放在模型上。不过,我在每个页面上都需要这个,所以我宁愿不必在每个控制器中添加这个逻辑。

我怀疑有更简洁的方法来做到这一点......

11 个答案:

答案 0 :(得分:55)

检查Spring安全标记:<sec:authentication property="principal.username" />

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

您可以检查是否记录:

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

而不是c:if

答案 1 :(得分:17)

我知道该帖子中还有其他答案,但没有人回答您如何检查用户是否经过身份验证。所以我正在分享我的代码看起来像什么。

在项目中包含标记lib:

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

然后通过添加:

在当前范围内创建用户对象
<sec:authentication var="user" property="principal" />

然后您可以通过添加轻松显示用户名。请记住,'principal'对象通常是string类型,除非您已经实现了spring security以将其更改为项目中的另一个类:

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

我希望这可以帮助有人检查用户角色。

如果你正在使用Maven,那么在这个帖子中添加Christian Vielma所提到的依赖标记。

谢谢!

答案 2 :(得分:11)

您可以这样使用: Spring Security Tag Lib - 3.1.3.RELEASE

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

然后:

${principal.username}

答案 3 :(得分:9)

我正在使用Maven,所以我必须添加taglibs库,将其添加到pom.xml

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

然后在我的jsp中添加:

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

<sec:authentication property="principal" />

principal.username一直给我错误(也许是我创建UsernamePasswordAuthenticationToken对象的方式,不确定)。

答案 4 :(得分:5)

我同意 alephx ,我甚至投了他的答案。

但是如果你需要另一种方法,你可以使用Spring Roo使用的方法。

如果你有SecurityContextHolderAwareRequestFilter,它使用访问SecurityContext的请求包装器提供标准的servlet API安全方法。

此过滤器使用Spring Security命名空间中的<http>标记进行注册。您也可以在FilterChainProxy的安全过滤器链中注册它(只需在applicationContext-security.xml中添加对已声明bean的引用)

然后,您可以像Roo一样访问安全servlet API(找到footer.jspx以查看如何编写条件注销链接)

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

答案 5 :(得分:5)

我认为<sec:authentication property="principal.username" />并不总是有效,因为Authentication.getPrincipal()返回的类型是Object,即:它可能是UserDetail(上面可以使用),字符串或任何东西其他

为了在JSP页面中显示用户名,我发现更可靠的是使用${pageContext.request.userPrincipal.name}

这使用返回String的java.security.Principal.getName()

答案 6 :(得分:5)

无论用户是否登录,这都有效,并且在使用匿名身份验证时可以正常工作:

<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>

...后来

Hello ${username}

答案 7 :(得分:2)

j标记是:

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

sec标签是:

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

添加到pom.xml:

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

添加到页面:

<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>

答案 8 :(得分:1)

据我所知,默认Spring Security 3.0.x installsSecurityContextHolderRquestAwareFilter,以便您可以通过调用Authentication获取HttpServletRequest.getUserPrincipal()对象,还可以通过调用查询角色HttpServletRequest.isUserInRole()

答案 9 :(得分:1)

要访问主体属性,首先,为属性创建一个变量:

<sec:authentication property="principal.attributes" var="principalAttr"/>

然后,您可以使用此映射通过属性键名称检索值:

${principalAttr.get("given_name")}

不要忘记在您的maven依赖项列表中添加spring security taglib:

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

答案 10 :(得分:0)

1)我的自定义用户类与额外的现场手机:

 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)在我的UserDetailsS​​erviceImpl.java中 我已经对这个CUSTOM SiteUser对象进行了扩展。

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;
}

3)以及我在以下方式访问:

&LT; a href =&#34;#&#34;个:文本=&#34; $ {#} httpServletRequest.userPrincipal.principal.mobile&#34;&GT;