Spring Security4源码解读探寻权限机制

我们知道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为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

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

时间: 2024-11-06 01:03:36

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

Spring:源码解读Spring IOC原理

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

Spring:源码解读Spring IOC原理--(转载)

转自:http://www.cnblogs.com/ITtangtang/p/3978349.html 这篇文章个人觉得整理的很不错,很值得学习,为了方便自己学习和大家学习,特转载此文保留.请尊重原创~~ Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileS

spring beans源码解读

spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.annotation, 支持包,提供对java 5注解处理bean样式的支持.org.springframework.beans.factory, 实现spring轻量级IoC容器的核心包.org.springframework.beans.factory.access, 定位和获取bean工程的辅助工具类

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

spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.annotation, 支持包,提供对java 5注解处理bean样式的支持.org.springframework.beans.factory, 实现spring轻量级IoC容器的核心包.org.springframework.beans.factory.access, 定位和获取bean工程的辅助工具类

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

关于Feign的超时详解: 在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那后台很有可能会出现Read Timeout这个异常. 1.关于hystrix的熔断超时 如果Feign开启了熔断,必须要重新设置熔断超时的时间,因为默认的熔断超时时间太短了,只有1秒,这容易导致业务服务的调用还没完成然后超时就被熔断了. 如何配置熔断超时: #Feign如

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

spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultListableBeanFactory 是整个spring ioc的始祖,研究透它的前生今世对我们理解spring ioc的概念有着重要的作用. 1. DefaultListableBeanFactory的作用: 默认实现了ListableBeanFactory和BeanDefinitionRegis

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

阅读Spring IoC部分源码有一段时间了,经过不断的单步调试和参阅资料,对Spring容器中bean管理有了一定的了解.这里从bean的几个状态的角度出发,研究下IoC容器. 一.原材料 Xml中的bean定义配置(或者注解).及Java代码 <bean id="book" name="book" class="com.sky.vo.Book" scope="singleton" init-method="

spring core源码解读之ASM4用户手册翻译

ASM动机: 程序的分析,生成,转换技术可以应用到许多场景: 1.程序分析,从简单的语法解析到完整的语义分析,可以应用在程序中找到潜在的bug,发现无用的代码,工程代码的逆向等等. 2.代码生成应用在各种编译器中:既包括传统的编译器也包括分布式编程的stub或者skeleton编译器,即时编译器等等. 3. 代码转换,可用于优化或混淆程序,向应用中插入测试或性能监控程序,面向切面编程等等. 这些技术可以用在任何编程语言,但或多或少容易依赖语言.在java 语言中,它们可以应用在源码中也可以应用在

spring core源码解读之ASM4用户手册翻译之一asm简介

第一章:ASM介绍 1.1 ASM动机: 程序的分析,生成,转换技术可以应用到许多场景: 1.程序分析,从简单的语法解析到完整的语义分析,可以应用在程序中找到潜在的bug,发现无用的代码,工程代码的逆向等等. 2.代码生成应用在各种编译器中:既包括传统的编译器也包括分布式编程的stub或者skeleton编译器,即时编译器等等. 3. 代码转换,可用于优化或混淆程序,向应用中插入测试或性能监控程序,面向切面编程等等. 这些技术可以用在任何编程语言,但或多或少容易依赖语言.在java 语言中,它们