我们知道springSecurity 会在用户登录的时候获取用户的角色权限, 你是一个普通用户可能没有管理员拥有的权限。用户登录后Authentication 获取用户的权限。 不通用户登录系统会生成各自Authentication

那么这个 Authentication 存在哪 呢?服务端?那100万 个用户都同时登录,系统如何区分哪个 Authentication是哪个用户的?

测试。使用两个账号,分布登录两个不通浏览器。一个是火狐,一个是谷歌。控制台分别打印出

==========================两个角色互不干扰。

这个授权是在调用登录接口时候验证的。

我的疑惑是如果是 存在内存里,内存怎么识别哪个用户哪个角色。

其他接口调用,使用AuthUtil 获取权限的时候, 没有在去授权

难道存在客户端的cookie?

现在一个测试浏览器 两个窗口打开, 登录两个不同的账号 ,结果不同角色不同权限。

好吧, 开始看源码吧。

先看我自定义的授权接口:

返回一个UsernamePasswordAuthenticationToken 对象,存储了用户名。 密码。权限

点进去

顶级接口AbstractAuthenticationToken

点进去

AbstractAuthenticationToken 这个抽象类, 实现了两个接口Authentication // CredentialsContainer

CredentialsContainer 接口点击进去

CredentialsContainer 谷歌翻译   凭据容器  难道是所有的授权存在这里?看了它 的方法, 只有一个, void eraseCredentials();  清除凭证

=====================先不探究

看下 另一个接口 Authentication

实现了Serializable 接口 。序列化对象。

好吧还是看不懂, 那看获取权限另一种方式, 不是AuthUtil

看下SecurityContextHolder 源码

有个静态方法     initialize();

看下这个方法

第一个 if判断 返回一个空

strategyName = MODE_THREADLOCAL;

THREADLOCAL 线程局部变量

每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。

继续往下面看:

这里跳转:

返回一个对象 ThreadLocalSecurityContextHolderStrategy

声明一个ThreadLocal

存储的是对象

================================

重点是这个set 方法, 看看被哪些 调用

被七个方法调用:

卧槽,

第一个

看看父类 AbstractSecurityInterceptor 抽象权限过滤器, 应该不是这个时候存进去的。

第二个 

DelegatingSecurityContextCallable  委派权限上下文对象, 看着也不像。

第三个

谷歌翻译 是消化授权过滤器, 应该不是这个时候存的

第四个

权限上下文持久化过滤器

看到持久化,赶紧点进去==》

response 里面拿?我记得我授权之后不是扔到response里面

继续看下五个

抽象权限拦截器, 这个更不是了

第六个

上下文进程拦截器。 马丹还不是。

第七个

委派权限上下文接口

这个线程好像也不是,现在似乎都很迷糊。

好吧还是研究UsernamePasswordAuthenticationToken

最终找到了,好吧, 这个 就是最终的设置方法了

来看他的源码:

原来是这样的。

==============================================================================================================

现在大概明白了 原理:

1 、用户密码用户名验证。

2 、授权通过,会放到threadLocal。

疑惑: 某个用户调用某个方法,获取方法,怎么判断他就是那个用户?

多个用户调用服务器这段代码, 获取不一样的角色怎么做到的!!!!

ThreadLocal在Spring中发挥着重要的作用,在管理request作用域的Bean、事务管理、任务调度、AOP等模块都出现了它们的身影,起着举足轻重的作用。要想了解Spring事务管理的底层技术,ThreadLocal是必须攻克的山头堡垒。

ThreadLocal是什么

早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。

ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

======================================================源码太多, 有些人说看源码是一种享受,很少吧

Spring Security4源码解读探寻权限机制的更多相关文章

  1. Spring:源码解读Spring IOC原理

    Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...

  2. spring beans源码解读

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

  3. spring beans源码解读之--总结篇

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

  4. 【Spring Cloud 源码解读】之 【如何配置好OpenFeign的各种超时时间!】

    关于Feign的超时详解: 在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务 ...

  5. Spring事务源码解读

    一.Spring事务使用 1.通过maven方式引入jar包 <dependency> <groupId>com.alibaba</groupId> <art ...

  6. Spring IoC源码解读——谈谈bean的几种状态

    阅读Spring IoC部分源码有一段时间了,经过不断的单步调试和参阅资料,对Spring容器中bean管理有了一定的了解.这里从bean的几个状态的角度出发,研究下IoC容器. 一.原材料 Xml中 ...

  7. spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  8. 【转载】Spring @Async 源码解读。

    由于工作中经常需要使用到异步操作,一直在使用@Async, 今天抽空学习了一下它的执行原理,刚好看到一篇写的很棒的文章,这里转载过来做个记录,感谢原作者的无私奉献. 原文章链接地址:https://w ...

  9. spring beans 源码解读

    从把spring下下来,导入到eclipse,花了几个小时的时间. 本来壮志雄心的说要,满满深入学习研读spring源码,现在看来还是不太现实,太难懂了,各种依赖,说明都是英文,整个串起来理解,深入研 ...

随机推荐

  1. STM32启动过程--启动文件--分析

    一.概述 1.说明 每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道.通过了解启动文件,我们可以体会到处理器的架构.指令集.中断向量安排等内容,是非常值得玩味的. ST ...

  2. Nexus 7 跳过网络验证

     本文从著名安卓论坛 xda-developers 搬运而来,原文链接 http://forum.xda-developers.com/showthread.php?t=1909602 由于众所周知的 ...

  3. [原博客] POI系列(3)

    正规.严谨.精妙. -POI BZOJ 1131 : [POI2008]Sta 树形dp吧,让求找一个点使以这个点深度和最小.首先可以随便整出来一棵树,对于每个节点记录down[i]以i为根下面的点的 ...

  4. /etc/passwd 与 /etc/shadow

    /etc/passwd是用户数据库,其中的域给出了用户名.加密口令和用户的其他信息. /etc/shadow是在安装了影子(shadow)口令软件的系统上的影子口令文件.影子口令文件将/etc/pas ...

  5. 关于多域名EXCHANGE如何设置PTR的问题

    找了很多网页, 有效的是MX可以设置不同的域名,但PTR只设置一个即可... 如果设置为一个IP为两个PTR,则在进行测试时,会发生DNS ROBBINS,即一次找这个,一次找那个. 切记. .... ...

  6. 深入了解View实现原理以及自定义View详解

    下面几篇文章对View的原理讲的非常详细. Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了解View(二) ...

  7. Button with Hover Effect (Learned from 百度脑图)

    今天想学学PM的技能, 打开了百度脑图的网站, 看到中间那个按键的hover效果蛮好看, 遂学习一下. 效果如下: Demo 其实就是利用:before绘制了半透明白色的遮罩, 平时用transfor ...

  8. [cocos2d]cocos2d 2.1与ios 6.0

    最近把xcode升级到4.5了,ios也编程6.0 mark一下需要修改的地方(针对于cocos2d 2.1版本),虽然都是warning,但是对于强迫症患者来说无法忍受啊~ 修改一 libs-Coc ...

  9. 转:三十、Java图形化界面设计——布局管理器之BorderLayout(边界布局)

    http://blog.csdn.net/liujun13579/article/details/7772215 边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH ...

  10. 【HDOJ】1890 Robotic Sort

    伸展树伤不起啊,很容易wa,很容易T,很容易M. /* 1890 */ #include <iostream> #include <string> #include <m ...