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

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

1.使用脚本

使用如下脚本来确定用户是否已登录:

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

不过,我不喜欢使用scriptlet,我想在一些@Controller标签中使用它,这需要将其作为页面属性放回去。

2.使用SecurityContextHolder

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

我怀疑有更干净的方法可以做到这一点...

10个解决方案
55 votes

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

[HTTP://static.spring source.org/spring-security/site/docs/3.0.小/reference/他管理不善.HTML]

您可以检查是否已记录:

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

而不是c:if

alephx answered 2020-08-10T13:19:18Z
17 votes

我知道线程中还有其他答案,但是没有人回答您如何检查用户是否已通过身份验证。 所以我在分享我的代码的样子。

在项目中包含标签lib:

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

然后通过添加以下内容在当前范围内创建一个用户对象:

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

然后,您可以通过添加轻松显示用户名。 请记住,“主要”对象通常为字符串类型,除非您已通过某种方式实现了spring安全性,从而将其更改为项目中的另一个Class:

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

希望这对希望检查用户角色的人有所帮助。

如果您正在使用Maven,则在该线程中添加Christian Vielma提到的依赖项标签。

谢谢!

Sameer Gupta answered 2020-08-10T13:20:05Z
11 votes

您可以这样使用:Spring Security标签库-3.1.3.RELEASE

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

然后:

${principal.username}
Raphael Villas Boas answered 2020-08-10T13:20:29Z
9 votes

我使用的是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对象的方式,不确定)。

Christian Vielma answered 2020-08-10T13:21:02Z
5 votes

我同意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=" | "/>
...

jbbarquero answered 2020-08-10T13:21:40Z
5 votes

我认为Authentication.getPrincipal()不能总是起作用,因为Authentication.getPrincipal()返回的类型是Object,即:它可以是UserDetail(上面的方法可以起作用),String或其他任何东西。

为了在JSP页面中显示用户名,我发现更可靠的方法是使用java.security.Principal.getName()

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

gerrytan answered 2020-08-10T13:22:09Z
5 votes

无论用户是否登录都可以使用,并且在使用匿名身份验证时可以使用:

<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}
Neil McGuigan answered 2020-08-10T13:22:33Z
3 votes

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>
Fatih Başar answered 2020-08-10T13:23:06Z
1 votes

据我所知,默认情况下,Spring Security 3.0.x安装了Authentication,以便您可以通过调用HttpServletRequest.getUserPrincipal()获得Authentication对象,还可以通过调用HttpServletRequest.isUserInRole()查询角色。

gpeche answered 2020-08-10T13:23:27Z
0 votes

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)在我的UserDetailsServiceImpl.java中我将此自定义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)并且我认为它是:

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

Akbar jan- JEE developer answered 2020-08-10T13:24:00Z
translate from https://stackoverflow.com:/questions/9048995/get-spring-security-principal-in-jsp-el-expression