在 JSP EL 表达式中获取 Spring Security Principal1. 使用脚本2. 使用安全上下文持有者

2022-08-31 23:49:11

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

1. 使用脚本

使用如下所示的脚本小工具来确定用户是否已登录:

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

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

2. 使用安全上下文持有者

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

我怀疑有一种更清洁的方法可以做到这一点...


答案 1

检查弹簧安全标签:<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


答案 2

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

在项目中包含标记库:

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

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

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

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

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

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

如果您使用的是Maven,请添加Christian Vielma在此线程中提到的依赖标签。

谢谢!