在JSP ELexpression式中获得Spring Security Principal

我正在使用Spring MVC和Spring安全版本3.0.6.RELEASE。 在我的JSP中获取用户名最简单的方法是什么? 甚至只是用户是否login? 我可以想到一些方法:

1.使用scriptlet

使用这样的脚本来确定用户是否login:

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

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

2.使用SecurityContextHolder

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

我怀疑有一个更清洁的方法来做到这一点…

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

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

你可以检查是否login:

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

而不是c:if

我知道在线程中还有其他答案,但没有人回答如何检查用户是否已通过身份validation。 所以我分享我的代码看起来喜欢什么。

在你的项目中join标签库:

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

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

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

然后,您可以通过添加轻松显示用户名。 请记住,“主体”对象通常是stringtypes的,除非您已经将spring安全性以某种方式更改为您的项目中的另一个类:

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

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

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

谢谢!

你可以这样使用:Spring Security Tag Lib – 3.1.3.RELEASE

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

接着:

 ${principal.username} 

我正在使用Maven,所以我不得不添加taglibs库添加到pom.xml

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

然后在我的jsp中join:

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

和:

 <sec:authentication property="principal" /> 

principal.username不断给我错误(也许是我创buildUsernamePasswordAuthenticationToken对象的方式,不知道)。

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

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

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

这个filter是用Spring Security命名空间的<http>标签注册的。 你也可以在FilterChainProxy的安全filter链中注册它(只需要在你的applicationContext-security.xml中添加一个声明bean的引用)

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

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

无论用户是否login,这都可以工作,并在使用匿名身份validation时有效:

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

我认为<sec:authentication property="principal.username" />不会总是有效,因为Authentication.getPrincipal()返回的types是Object,即:它可以是一个UserDetail (上面的工作),一个String或还要别的吗。

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

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

据我所知默认情况下, Spring Security 3.0.x安装一个SecurityContextHolderRquestAwareFilter ,这样你就可以通过调用HttpServletRequest.getUserPrincipal()来获得Authentication对象,也可以通过调用HttpServletRequest.getUserPrincipal()来查询angular色。

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我的这个自定义的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}”>