spring security

场景:张三是一个老师,他应邀去参加教师节活动(认证)去领取教师节礼物(授权、鉴权);李四不是老师,不能参加活动(认证失败)。
--Principal接口--->被认证/授权者。对应现实中的用户,对现实中的用户的抽象,该用户可能是一个用户名,也可能是一个token(Token可以理解为由原始的基于账号密码的Principal转换的基于一串加密的字符串的Pricipal,本质上都是一个唯一用户标识),反正就是一个标识。提供一个获取用户名称/个人标识的方法(getName())。(普通自然人张三)
--UserDetails--->用户的详细信息,代表的是自己业务系统(用户系统)的账号,对应用户表。用来比对密码,账号等可以实现Principal接口,用来当做Principal的扩展;
--UserDetailService--->用来查询用户详细信息的Service。
--Authentication接口--->认证/授权后的主体。是对现实中的用户加上一些认证/授权信息后形成的对象的抽象。继承自Principal,除此之外,还定义了方法:获取被认证者的详细信息(getDetail());判断是否已经通过认证(isAuthenticated());设置认证结果(是否通过授权setAuthenticated());获取身份“凭证”,如密码等——根据实际情况来判断(getCredentials())。认证的目的就是生成这个实体.(通过身份验证后的张三。此时,它已经从一个普通自然变成了该活动的'嘉宾'了,具有领礼物的权利,没通过认证的李四就没能成为嘉宾。)
--AbstractAuthenticationToken抽象类--->Authentication的最重要抽象实现类。除了实现Authentication接口的方法外,还持有一个GrantedAuthority列表,用来记录该用户具有哪些权限。
--GrantedAuthority接口--->权限的抽象。每一个实现类就是一个权限,提供一个获取权限标识的方法(getAuthority())。一个通过认证后的用户就具有若干权限,即若干该接口的实现类。这些权限集合保存在授权后的主体AbstractAuthenticationToken中,通过getAuthority()方法获取。(比如教师节活动上,可以吃水果,可以领礼物的权限等)注意:SpringSecurity里权限和角色都用GrantedAuthority封装,通过ROLE_前缀来区分角色。

以上为“数据对象”,也就是用来承载数据的(类似java里的VO)。还有一些类用来执行操作,主要为认证鉴权操作(XXXManager,XXXProvider),如下:

--AuthenticationManager接口--->认证管理器,用来执行具体认证逻辑的接口。该接口提供了一个authenticate(Authentication var1)方法,用来执行具体的认证逻辑。入参是一个Authentication对象,出参也是一个Authentication对应,入参对象是原始用户基本信息(Principal),出参对象是一个根据用户基本信息认证后的对象,包含认证结果等信息。(它就像一个保安,用户输入他的基本信息,经过保安的认证成功后(也可能失败),给他一个通行证。人还是这个人,多了个通行证信息)
--RunAsManager--->另外一种Manager,用另外一个身份去认证。
--AuthenticationProvider`接口--->上面提到AuthenticationManager负责认证。但他相当于一次性认证,而在实际运用场景中,整个认证流程可能分为很多环节,形成一个链条。所以每个环节封装成用一个AuthenticationProvider实例。AuthenticationProvider提供了两个方法,一个authenticate(Authentication var1),作用同AuthenticationManager的该方法,还有一个supports(Class<?> var1)方法,用来确定该环节对哪些类有效。
--ProviderManager接口--->继承AuthenticationManager,处理多个认证环节的AuthenticationManager。书接上文,多个AuthenticationProvider需要交给一个Manager统一处理,ProviderManager持有一个AuthenticationProvider集合,通过遍历执行各个AuthenticationProvider,AuthenticationManager将认证逻辑(authentication(Authentication var1))委托给各个Provider去执行。只要一个Provider不成功,就返回认证失败。
--AuthenticationManagerBuilder--->用来构建AuthenticationManager,指定认证元数据,包含账号密码等,该数据可以从内存读取,也可以从数据库读取。(告诉保安,具备哪些信息和特征的人才能进入,然后保安就根据这些信息去认证(调用AuthenticationManager.authenticate(Authentication var1)))
--SpringSecurityContext--->安全上下文容器,用来保存获取权限认证的一些主体信息,可以再当前安全范围内通过调用静态方法的方式随时随地传递Principal信息。类比保安部门,所有安保相关的信息都保存在这里,包括Authentication信息等。SpringSecurityContext可以通过SpringSecurityContextHolder获取,同时它也被保存杂HttpSession中(该保存动作由SecurityContextPersistenceFilter执行,该过滤器包含在整个过滤链中,它除了保存上下文信息外,也负责当请求完成后清除上下文信息)。但是我们一般不从HttpSesstion中获取,而是从SpringSecurityContext中获取。
--SpringSecurityContextHolder--->获取安全上下文容器的"把手"类比进入保安部办公室钥匙,可以通过这个holder获得(进入)保安部。
--ExceptionTranslationFilter--->该过滤器用来检测Spring Security异常,统一处理各种异常(认证异常或者权限不足)。这些异常通常由各个拦截器AbstractSecurityInterceptor抛出。
--AuthenticationEntryPoint--->没有认证直接访问接口的处理逻辑类。用来处理没有认证时的情况,一般是跳转到登录页面去登录。
--AccessDecisionManager--->权限管理器,负责检验是否具有权限访问受保护的资源。通过decide(Authentication var1, Object var2, Collection<ConfigAttribute> var3)方法校验是否具有权限。该方法的三个属性分别是待鉴权主体(用户),安全对象(一个方法调用或者一个web请求),配置属性(配置中指定的需要哪些权限,当然你也可以在decide方法中实现成不需要这些权限)。
--AbstractSecurityInterceptor--->拦截器接口,每个安全对象类型(一个方法调用或者一个web请求)都有特定的AbstractSecurityInterceptor 实现类,用来拦截对应的安全对象并调用相关的Manager去实现认证鉴权。
--SecurityMetadataSource-->用来获取安全对象(一个方法调用或者一个web请求)需要的权限,再结合Principal中保存的用户权限信息调用对应的投票器来决定是否通过鉴权。

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容