在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)在我的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}”>