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为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
======================================================源码太多, 有些人说看源码是一种享受,很少吧
Spring Security4源码解读探寻权限机制的更多相关文章
- Spring:源码解读Spring IOC原理
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
- spring beans源码解读
spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...
- spring beans源码解读之--总结篇
spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...
- 【Spring Cloud 源码解读】之 【如何配置好OpenFeign的各种超时时间!】
关于Feign的超时详解: 在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务 ...
- Spring事务源码解读
一.Spring事务使用 1.通过maven方式引入jar包 <dependency> <groupId>com.alibaba</groupId> <art ...
- Spring IoC源码解读——谈谈bean的几种状态
阅读Spring IoC部分源码有一段时间了,经过不断的单步调试和参阅资料,对Spring容器中bean管理有了一定的了解.这里从bean的几个状态的角度出发,研究下IoC容器. 一.原材料 Xml中 ...
- spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory
spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...
- 【转载】Spring @Async 源码解读。
由于工作中经常需要使用到异步操作,一直在使用@Async, 今天抽空学习了一下它的执行原理,刚好看到一篇写的很棒的文章,这里转载过来做个记录,感谢原作者的无私奉献. 原文章链接地址:https://w ...
- spring beans 源码解读
从把spring下下来,导入到eclipse,花了几个小时的时间. 本来壮志雄心的说要,满满深入学习研读spring源码,现在看来还是不太现实,太难懂了,各种依赖,说明都是英文,整个串起来理解,深入研 ...
随机推荐
- Linux下find指令
Linux是一个“一切皆文件”的操作系统,find(查找文件)指令就尤为重要了.find命令在目录结构中搜索文件,并执行指定的操作. 1.命令格式: find pathname -options [- ...
- Python3实现连接SQLite数据库的方法
本文实例讲述了Python3实现连接SQLite数据库的方法,对于Python的学习有不错的参考借鉴价值.分享给大家供大家参考之用.具体方法如下: 实例代码如下: ? 1 2 3 4 5 6 7 8 ...
- c# 如何通过反射 获取\设置属性值、
//定义类public class MyClass{public int Property1 { get; set; }}static void Main(){MyClass tmp_Class = ...
- Gartner 如何看 RASP 和 WAF?
在这个计算机网络飞速发展的网络时代里,新兴的网络威胁正在不断「侵蚀」着的应用程序和核心数据的安全,各种繁杂的防护手段也随之接踵而来.众所周知,Gartner 是全球最具权威的 IT 研究与顾问咨询公司 ...
- 網站SSL加密原理簡介(2张图,握手有9个步骤,解释的很清楚)
Secure Socket Layer說明 SSL是Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸.最早是Netscape公司所提出,SSL的目 ...
- Android应用架构
Android开发生态圈的节奏非常之快.每周都会有新的工具诞生,类库的更新,博客的发表以及技术探讨.如果你外出度假一个月,当你回来的时候可能已经发布了新版本的Support Library或者Play ...
- php Laravel 框架 介绍及安装
Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...
- 使用C#画图(饼图折线图)
public PlaceHolder PlaceHolder1; //显示图像的控件 各个图像的类别名称如下: PictureType 图形种类 5 chChartTypeBarCl ...
- ASP.NET中定制自己的委托和事件参数类
本文笔记选自<庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术>一书 一般在实际开发中,对于事件不需要传递数据信息时,像上面的KingTextBox控件的事件,在引发事件时传递的 ...
- 转自 x_x_的百度空间 搞ACM的你伤不起
来源:http://roba.rushcj.com/?p=548 劳资六年前开始搞ACM啊!!!!!!!!!! 从此踏上了尼玛不归路啊!!!!!!!!!!!! 谁特么跟劳资讲算法是程序设计的核心啊!! ...