关于Spring Security 3获取用户信息的问题
2016-01-26 09:07
615 查看
标签: spring security 3标签获取用户信息
2013-01-05 10:40 5342人阅读 评论(0) 收藏 举报
分类:
Spring(25)
java(70)
前端(7)
目录(?)[+]
原文:http://blog.csdn.net/jjk_02027/article/details/6544889
Spring Security 3取不到用户信息的问题
不是<intercept-url/>惹的祸|而是你没有真正的掌握spring sercurity3、没有真正的理解<intercept-url/>
也许你遇到过这样的问题:
1:在Servlet中使用SecurityContextHolder怎么也无法获取到用户信息.而在jsp页面里面用spring security的标签又可以取到它。
2:在Struts2的Action中使用SecurityContextHolder怎么也无法获取到用户信息.而在jsp页面里面用spring security的标签又可以取到它。
3:在Spring MVC的Control中使用SecurityContextHolder怎么也无法获取到用户信息.而在jsp页面里面用spring security的标签又可以取到它。
4:在有的action、servlet或Spring MVC的C(Control)中使用SecurityContextHolder能够获取到用户信息,而在有的action或servlet中使用SecurityContextHolder又获取不到用户信息
在你看到我的文章的时候如果你还没有解决这个问题,那么恭喜你!你很有可能将在这里找到答案。
在Java中取用户信息的代码:
[java] view plaincopy
Object principal = SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
if(principal instanceof UserDetails){
username =((UserDetails)principal).getUsername();
Iterator it = ((UserDetails)principal).getAuthorities().iterator();
String authority = "";
while(it.hasNext()){
authority = ((GrantedAuthority)it.next()).getAuthority();
System.out.println("Authority:"+authority);
}
}
你是不是同时在spring security 3的配置文件中加入了类似下面的代码:
例:applicationContext-security.xml
[xhtml] view plaincopy
<intercept-url pattern="/dwr/**" filters="none"/>
<intercept-url pattern="/css/**" filters="none"/>
<intercept-url pattern="/images/**" filters="none"/>
<intercept-url pattern="/scripts/**" filters="none"/>
<intercept-url pattern="/index.html*" filters="none"/>
<intercept-url pattern="/mydefault/**" filters="none"/>
<!--
<intercept-url pattern="/admin/**" filters="none"/>
-->
当你的servlet、action或Spring MVC的C(Control)相对应的url是以/mydefalut/开头,如果你要使用SecurityContextHolder获取用户信息,那么我告诉你,你想都别想。绝对是不可能的!
当你的servlet、action或Spring MVC的C相对应的url是以/admin/开头(或者其它没有没有配置filter为none的url),如果你要使用SecurityContextHolder获取用户信息,那么我想你是没有问题的。
问题讲解:
这要从Spring Security的工作原理讲起:
[xhtml] view plaincopy
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring Security就是一个filter,如果你把Spring Security的配置文件中某个url-pattern 的filter配置为none,那么与这个url相关的请求,Spring Security是不会干活滴!
[html] view plaincopy
<b>
Spring Security就是一个filter,如果你把Spring Security的配置文件中某个url-pattern 的filter配置为none,那么与这个url相关的请求,Spring Security是不会干活滴!
</b>
附:
jsp中使用标签取用户名
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<sec:authentication property="name"/>
纠正部分软网友的一些相关问题:
5:在Struts与Spring真正集成的环境中,使用SecurityContextHolder怎么也无法获取到用户信息.而在jsp页面里面用spring security的标签又可以取到它。有些软网友认为是因为Struts转发了请求,所以这时SecurityContextHolder清空了用户信息。
非也。真正的问题如此正文。
--软网友(搞软件的网友,转用请著明始创者:JJK)
Spring Security3 页面 权限标签
原文:http://hehch.iteye.com/blog/1409959应用标签库:<%@ taglib prefix='security' uri='http://www.springframework.org/security/tags' %>
<security:authorize>是一个流程控制标签,能够在满足特定安全需求的条件下显示它的内容体。它有三个互斥的参数:
ifAllGranted——是一个由逗号分隔的权限列表,用户必须拥有所有列出的权限时显示;
ifAnyGranted——是一个由逗号分隔的权限列表,用户必须至少拥有其中的一个权限时才能显示;
ifNotGranted——是一个由逗号分隔的权限列表,用户未拥有所有列出的权限时才能显示。
<security:authentication>获得属性的值比如要获得用户名可以这么写:
<security:authentication property="principal.username"></security:authentication>
他有三个属性,property是必须的,另外scope和var,var定义一个变量,scope定义var存在的范围
例子:
有时需要在页面显示用户名,或者根据用户角色显示或者不显示一些内容。这需要使用到spring security提供的标签库。
在页面中引入标签库:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
使用标签库的示例:
<sec:authentication property="principal" var="authentication"/> <sec:authorize ifAllGranted="ROLE_USER">可以访问</sec:authorize> 用户名:${authentication.username }<br />
前台 ROLE_ANONYMOUS表示匿名用户
在配置文件中可以设置页面进入的权限
<intercept-url pattern="/Homepage.*" access="ROLE_ADMIN,IS_AUTHENTICATED_ANONYMOUSLY"/>
IS_AUTHENTICATED_ANONYMOUSLY允许匿名用户进入
IS_AUTHENTICATED_FULLY 允许登录用户进入
IS_AUTHENTICATED_REMEMBERED 允许登录用户和rememberMe用户进入
IS_AUTHENTICATED_FULLY:是则满足以下情况返回通过:
**.既不是RememberMeAuthentication也不是AnonymousAuthenticationToken的实例
IS_AUTHENTICATED_REMEMBERED:是则满足以下任一情况返回通过:
a*.Authentication是RememberMeAuthenticationToken的实例
b*.既不是RememberMeAuthentication也不是AnonymousAuthenticationToken的实例
IS_AUTHENTICATED_ANONYMOUSLY:是则满足以下任一情况返回通过:
a*.Authentication是AnonymousAuthenticationToken的实例
b*.既不是RememberMeAuthentication也不是AnonymousAuthenticationToken的实例
c*.Authentication是RememberMeAuthenticationToken的实例
相关文章推荐
- Spring security 获取当前用户
- 使用javassist动态注入代码
- swagger 与 springboot 的整合实战
- 2015-2016-2 《Java程序设计》教学进程
- java发送javax.mail邮件实例讲解
- eclipse安装activiti5.18插件失败
- 深入解析Java的Spring框架中的混合事务与bean的区分
- Java IO最详解
- Java 小样例:图书馆课程设计(Java 8 版)
- Eclipse/Myeclipse 开发项目技巧
- 学习java之内部类使用以及链式编程
- JavaSE017_数组之应用举例(利用二维数组实现五子棋功能完善——二人对战)
- Java I/O流详解
- Eclipse配置
- spring AOP advice 类型 和 通用的切点的配置方式
- 在Myeclipse下运行JUnit & ant
- JAVA中的代码块
- 传智播客168期JavaEE就业班(第一天 html)
- 正式发表--java学习第二天,变量等信息。
- Java设计模式-策略模式(Strategy Pattern)