博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Security 3 用户信息的问题
阅读量:4036 次
发布时间:2019-05-24

本文共 4021 字,大约阅读时间需要 13 分钟。

不是<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] 
  1. Object principal =  SecurityContextHolder.getContext()  
  2.   .getAuthentication().getPrincipal();  
  3. if(principal instanceof UserDetails){  
  4.   username =((UserDetails)principal).getUsername();  
  5.   Iterator it = ((UserDetails)principal).getAuthorities().iterator();  
  6.   String authority = "";  
  7.   while(it.hasNext()){  
  8.     authority = ((GrantedAuthority)it.next()).getAuthority();  
  9.     System.out.println("Authority:"+authority);  
  10.   }  
  11. }  

 

 

你是不是同时在spring security 3的配置文件中加入了类似下面的代码:

例:applicationContext-security.xml

[xhtml] 
  1. <intercept-url pattern="/dwr/**" filters="none"/>  
  2. <intercept-url pattern="/css/**" filters="none"/>  
  3. <intercept-url pattern="/images/**" filters="none"/>  
  4. <intercept-url pattern="/scripts/**" filters="none"/>  
  5. <intercept-url pattern="/index.html*" filters="none"/>  
  6. <intercept-url pattern="/mydefault/**" filters="none"/>  
  7. <!-- 
  8. <intercept-url pattern="/admin/**" filters="none"/> 
  9. -->  

当你的servlet、action或Spring MVC的C(Control)相对应的url是以/mydefalut/开头,如果你要使用SecurityContextHolder获取用户信息,那么我告诉你,你想都别想。绝对是不可能的!

 

当你的servlet、action或Spring MVC的C相对应的url是以/admin/开头(或者其它没有没有配置filter为none的url),如果你要使用SecurityContextHolder获取用户信息,那么我想你是没有问题的。

 

问题讲解:

这要从Spring Security的工作原理讲起:

[xhtml] 
  1. <filter>  
  2.   <filter-name>springSecurityFilterChain</filter-name>  
  3.   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  4. </filter>  
  5.    
  6. <filter-mapping>  
  7.   <filter-name>springSecurityFilterChain</filter-name>  
  8.   <url-pattern>/*</url-pattern>  
  9. </filter-mapping>  

 

Spring Security就是一个filter,如果你把Spring Security的配置文件中某个url-pattern 的filter配置为none,那么与这个url相关的请求,Spring Security是不会干活滴!

[html] 
  1. <b>  
  2. Spring Security就是一个filter,如果你把Spring Security的配置文件中某个url-pattern 的filter配置为none,那么与这个url相关的请求,Spring Security是不会干活滴!  
  3. </b>  

 

 

附:

jsp中使用标签取用户名

<%@ taglib prefix="sec" uri="" %>

<sec:authentication property="name"/>

 

纠正部分软网友的一些相关问题:

5:在Struts与Spring真正集成的环境中,使用SecurityContextHolder怎么也无法获取到用户信息.而在jsp页面里面用spring security的标签又可以取到它。有些软网友认为是因为Struts转发了请求,所以这时SecurityContextHolder清空了用户信息。

非也。真正的问题如此正文。

 

--软网友(搞软件的网友,转用请著明始创者:JJK)


原文:

应用标签库:<%@ 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"
%
>

使用标签库的示例:

可以访问
用户名:${authentication.username }
前台 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的实例

转载地址:http://kbjdi.baihongyu.com/

你可能感兴趣的文章
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.147 - LeetCode1108
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>