整合Spring Security3,在JSP中获取当前登陆用户信息 2013-02-20 20:31:32| 分类: Spring | 标签: |举报 |字号大
中
小 订阅
最近在学习Spring Security3,遇到了很多问题。唉,有点乱,不过我还是努力整理了一下。O(∩_∩)O~
开始说正文。
我是想在JSP中判断用户是否登陆,以及取到用户名,网上搜索了一下,也找到了几种方法,但不是我想要的。
之前搜索到的几种方法:
一种是使用标签库:
在JSP中先加入
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
然后使用
<sec:authentication property="name"/>
就可以取到当前登陆的用户名了。再一种是在Java中的代码:
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
System.out.println("用户名:" + (UserDetails) principal).getUsername();
}
以上两种方法都可以取到当前登录的用户名。但是我想在JSP中判断取到当前登陆用户的用户名。所以我想把Java中的代码挪到JSP中使用,这时候就遇到问题了。总是抛NullPointerException。
搜索了一下,找到是SecurityContextHolder总是为空。原因是要使用Java的那段代码,必须要在Spring Security过滤器执行中执行,否则在该过滤器执行完之后,org.springframework.security.web.context.SecurityContextPersistenceFilter类会调用SecurityContextHolder.clearContext(),这样SecurityContextHolder就被清空了,所以在JSP中的SecurityContextHolder会返回NULL。
解决方法:
在经过Spring Security认证之后,Security会把一个SecurityContextImpl对象存储到session中,这个对象中存有当前用户的信息。
SecurityContextImpl securityContextImpl = (SecurityContextImpl) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
//登录名
System.out.println("Username:" + securityContextImpl.getAuthentication().getName());
//登录密码,未加密的
System.out.println("Credentials:" + securityContextImpl.getAuthentication().getCredentials());
WebAuthenticationDetails details = (WebAuthenticationDetails)securityContextImpl.getAuthentication().getDetails();
//获得访问地址
System.out.println("RemoteAddress" + details.getRemoteAddress());
//获得sessionid
System.out.println("SessionId" + details.getSessionId());
//获得当前用户所拥有的权限
List<GrantedAuthority> authorities = (List<GrantedAuthority>)securityContextImpl.getAuthentication().getAuthorities();
for (GrantedAuthority grantedAuthority : authorities) {
System.out.println(“Authority” + grantedAuthority.getAuthority());
}
涨知识了,呵呵~~~
中
小 订阅
最近在学习Spring Security3,遇到了很多问题。唉,有点乱,不过我还是努力整理了一下。O(∩_∩)O~
开始说正文。
我是想在JSP中判断用户是否登陆,以及取到用户名,网上搜索了一下,也找到了几种方法,但不是我想要的。
之前搜索到的几种方法:
一种是使用标签库:
在JSP中先加入
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
然后使用
<sec:authentication property="name"/>
就可以取到当前登陆的用户名了。再一种是在Java中的代码:
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
System.out.println("用户名:" + (UserDetails) principal).getUsername();
}
以上两种方法都可以取到当前登录的用户名。但是我想在JSP中判断取到当前登陆用户的用户名。所以我想把Java中的代码挪到JSP中使用,这时候就遇到问题了。总是抛NullPointerException。
搜索了一下,找到是SecurityContextHolder总是为空。原因是要使用Java的那段代码,必须要在Spring Security过滤器执行中执行,否则在该过滤器执行完之后,org.springframework.security.web.context.SecurityContextPersistenceFilter类会调用SecurityContextHolder.clearContext(),这样SecurityContextHolder就被清空了,所以在JSP中的SecurityContextHolder会返回NULL。
解决方法:
在经过Spring Security认证之后,Security会把一个SecurityContextImpl对象存储到session中,这个对象中存有当前用户的信息。
SecurityContextImpl securityContextImpl = (SecurityContextImpl) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
//登录名
System.out.println("Username:" + securityContextImpl.getAuthentication().getName());
//登录密码,未加密的
System.out.println("Credentials:" + securityContextImpl.getAuthentication().getCredentials());
WebAuthenticationDetails details = (WebAuthenticationDetails)securityContextImpl.getAuthentication().getDetails();
//获得访问地址
System.out.println("RemoteAddress" + details.getRemoteAddress());
//获得sessionid
System.out.println("SessionId" + details.getSessionId());
//获得当前用户所拥有的权限
List<GrantedAuthority> authorities = (List<GrantedAuthority>)securityContextImpl.getAuthentication().getAuthorities();
for (GrantedAuthority grantedAuthority : authorities) {
System.out.println(“Authority” + grantedAuthority.getAuthority());
}
涨知识了,呵呵~~~