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中取用户信息的代码:

  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

  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的工作原理讲起:

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

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

  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的实例

关于Spring Security 3获取用户信息的问题的更多相关文章

  1. spring security LDAP获取用户信息

    很多企业内部使用LDAP保存用户信息,这章我们来看一下如何从LDAP中获取Spring Security所需的用户信息. 首先在pom.xml中添加ldap所需的依赖. <dependency& ...

  2. Spring Boot+Spring Security:获取用户信息和session并发控制

    说明 (1)JDK版本:1.8(2)Spring Boot 2.0.6(3)Spring Security 5.0.9(4)Spring Data JPA 2.0.11.RELEASE(5)hiber ...

  3. spring security中当前用户信息

    1:如果在jsp页面中获取可以使用spring security的标签库 在页面中引入标签   1 <%@ taglib prefix="sec" uri="htt ...

  4. Spring Boot 构建电商基础秒杀项目 (二) 使用 Spring MVC 方式获取用户信息

    SpringBoot构建电商基础秒杀项目 学习笔记 修改 DOMapper 在 UserPasswordDOMapper.xml 添加: <select id="selectByUse ...

  5. spring security+freemarker获取登陆用户的信息

    spring security+freemarker获取登陆用户的信息 目标页面之间获取 ${Session.SPRING_SECURITY_CONTEXT.authentication.princi ...

  6. spring security实现记录用户登录时间等信息

    目录 spring security实现记录用户登录时间等信息 一.原理分析 二.实现方式 2.1 自定义AuthenticationSuccessHandler实现类 2.2 在spring-sec ...

  7. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

  8. 整合spring cloud云架构 - 根据token获取用户信息

    根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * @param accessToken * @return * @throws Exception */ @ ...

  9. 从SpringMVC获取用户信息谈起

    Github地址:https://github.com/andyslin/spring-ext 编译.运行环境:JDK 8 + Maven 3 + IDEA + Lombok spring-boot: ...

随机推荐

  1. 第二节windows系统下Xshell 5软件远程访问虚拟机 Linux系统

    下载Xshell 5软件在windows下安装 安装好后Xshell 5启动软件 下一步,检查虚拟机,配置是否正确 下一步,设置网络,保障虚拟机系统能够连接网络 下一步,进入虚拟机系统,检查虚拟机网络 ...

  2. html5 article标签举例

    <article> 是html5中引入的新标签可以实现正向反向列表排序功能 使用以前的html4进行列表排序,可以使用下列形式 <h1>Top Three Teams</ ...

  3. XML 用途

    XML 用途 XML 应用于 Web 开发的许多方面,常用于简化数据的存储和共享. XML 把数据从 HTML 分离 如果您需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编 ...

  4. 2、Spring的 IoC详解(第一个Spring程序)

    Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.在这句话中重点有两个,一个是IoC,另一个是AOP.今天我们讲第一个IoC. IoC概念 ...

  5. LeetCode OJ 4. Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  6. Gentoo本地化设置--时区、时钟、字体、中文环境

    时区 你需要选择时区让系统知道你的地理位置,以保持正确的时间.在/usr/share/zoneinfo中查找你的时区.然后在/etc/conf.d/clock中设置时区.请忽略/usr/share/z ...

  7. iOS之多线程NSOperation

    目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实 ...

  8. 菲菲更名宝贝 得意非凡版 v1.9 免费绿色版

    软件名称: 菲菲更名宝贝 得意非凡版软件语言: 简体中文授权方式: 免费软件运行环境: Win8 / Win7 / Vista / WinXP软件大小: 12.5MB图片预览: 软件简介:菲菲更名宝贝 ...

  9. Value '0000-00-00' can not be represented as java.sql.Date

    Value '0000-00-00' can not be represented as java.sql.Date 时间 2014-07-30 09:00:50 ITeye-博客 原文  http: ...

  10. caffe层解读系列-softmax_loss

    转自:http://blog.csdn.net/shuzfan/article/details/51460895 Loss Function softmax_loss的计算包含2步: (1)计算sof ...