zoukankan      html  css  js  c++  java
  • 关于Spring Security 3获取用户信息的问题

     

    标签: spring security 3标签获取用户信息
     分类:
     

    目录(?)[+]

     

    原文: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
     
     
    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] view plaincopy
     
     
    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] view plaincopy
     
     
    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] view plaincopy
     
     
    1. <b>  
    2. Spring Security就是一个filter,如果你把Spring Security的配置文件中某个url-pattern 的filter配置为none,那么与这个url相关的请求,Spring Security是不会干活滴!  
    3. </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 页面 权限标签

    应用标签库:<%@ 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的实例
  • 相关阅读:
    Jersey初始化配置
    Jersey框架简介
    警告: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:esignmanage' did not find a matching property.解决
    HIbernate基于外键的查询
    Apache Maven 入门篇(下)
    Apache Maven 入门篇 ( 上 )
    DetachedCriteria用法
    SQL Excel导入到sqlserver表
    轮番图片js
    Js Tab页(二)
  • 原文地址:https://www.cnblogs.com/yanduanduan/p/5159293.html
Copyright © 2011-2022 走看看