【深入浅出Spring Security(一)】Spring Security的整体架构

这篇具有很好参考价值的文章主要介绍了【深入浅出Spring Security(一)】Spring Security的整体架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇博客所述主要是在读《深入浅出Spring Security》途中所做的笔记(之前有学Spring Security,但了解的比较浅,所以想着看这本书深入一点点,这都是因为上次一个bug调了我几天)

这本书的 pdf 网盘链接可通过微信扫下方公众号私信"深入浅出Spring Security"即可获取。

一、整体架构

在 SpringSecurity 的架构设计中,认证(Authentication)和授权(Authorization)是分开的,无论使用什么样的认证方式,都不会影响授权,这是两个独立的存在,这种独立带来的好处之一,就是可以非常方便地整合一些外部的解决方案。下图是认证和授权所用到的核心接口(下面会分别进行解释):

【深入浅出Spring Security(一)】Spring Security的整体架构

认证(Authentication)

通俗地说,认证就是身份认证(你是谁?)

AuthenticationManager

在SpringSecurity中认证是由 AuthenticationManager 接口来负责的,接口定义为:

public interface AuthenticationManager {
    Authentication authenticate(Authentication authentication) throws AuthenticationException;
}
  • 返回 Authentication 表示认证成功;
  • 返回 AuthenticationException 异常,表示认证失败。

AuthenticationManager 主要实现类为 ProviderManager,在 ProviderManager 中管理了众多AuthenticationProvider 实例。在一次完整的认证流程中,SpringSecurity 允许存在多个AuthenticationProvider,用来实现多种认证方式,这些 AuthenticationProvider 都是由 ProviderManager 进行统一管理的。

【深入浅出Spring Security(一)】Spring Security的整体架构

Authentication

认证以及认证成功的信息主要是由 Authentication 的实现类进行保存的,Authentication 接口的结构如下:

【深入浅出Spring Security(一)】Spring Security的整体架构

  • getAuthorities:获取用户权限信息;
  • getCredentials:获取用户凭证信息,一般指密码;
  • getDetails:获取用户详细信息;
  • getPrincipal:获取用户身份信息,用户名、用户对象等;
  • isAuthentiacted:用户是否认证成功

登录后的数据保存(SecurityContextHolder)

SecurityContextHolder 用来获取登录之后的用户信息。SpringSecurity 会将登录用户数据保存在 Session 中。但是,为了使用方便,SpringSecurity 在此基础上做了一些改进,其中最主要的一个变化就是线性绑定。当用户登录成功后,SpringSecurity 会将登录成功的用户信息保存到 SecurityContextHolder 中。SecurityContextHolder 中的数据保存默认是通过 ThreadLocal 来实现的,使用 ThreadLocal 创建的变量只能被当前线程访问,不能被其他线程访问和修改,也就是用户数据和请求线程绑定在一起。

当登录请求处理完毕后,SpringSecurity 会将SecurityContextHolder 中的数据拿出来保存到session中,同时将 SecurityContextHolder 中的数据清空。以后每当有请求到来时,SpringSecurity 就会先从 Session 中取出用户登录数据,保存到 SecurityContextHolder 中,方便在该请求的后续处理过程中使用,同时在请求结束时将 SecurityContextHolder 中的数据拿出来保存到 Session 中,然后将Security 的 SecurityContextHolder 中的数据清空。这一策略非常方便用户在 Controller、Service 层以及任何代码中获取当前登录用户数据。

其实它就是为了方便我们拿用户信息数据,免得每次都得从 Session 会话中拿,从Session会话中拿,不好的地方就是要进行 SessionID 的判断,封装到SecurityContextHolder中就减少了判断这一步,直接获取即可。

授权(Authorization)

通俗点说,授权就是访问控制(你可以做什么?)

当完成认证后,接下来就是授权了。在SpringSecurity 的授权体系中,有两个关键的接口:

  • AccessDecisionManager:访问决策管理器,用来决定此次访问是否被允许。

    • public interface AccessDecisionManager {
      
      	void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)
      			throws AccessDeniedException, InsufficientAuthenticationException;
      
      	boolean supports(ConfigAttribute attribute);
      
      	boolean supports(Class<?> clazz);
      
      }
      
  • AccessDecisionVoter:访问决定投票器,投票器会检查用户是否具备应有的角色,进而投出赞成、反对或者弃权票。voter(选举人)

    • public interface AccessDecisionVoter<S> {
      
      	int ACCESS_GRANTED = 1;// granted:赞同
      
      	int ACCESS_ABSTAIN = 0;// abstain:弃权
      
      	int ACCESS_DENIED = -1;// denied:反对,否认
      
      	boolean supports(ConfigAttribute attribute);
      
      	boolean supports(Class<?> clazz);
      
      	int vote(Authentication authentication, S object, Collection<ConfigAttribute> attributes);
      
      }
      

AccessDecisionVoter 和 AccessDecisionManager 都有众多的实现类,在 AccessDecisionManager 中会挨个遍历 AccessDecisionVoter,进而决定是否允许用户访问,因而 AccessDecisionVoter 和 AccessDecisionManager 两者的关系类似于 AuthenticationProvider 和 ProviderManager 之间的关系。

ConfigAttribute

在 AccessDecisionVoter 接口下的 vote 方法中,第三个参数是一个泛型参为ConfigAttribute 的Collection 集合对象。它你可以理解为是角色全称字符串的集合,内部就一个getAttribute方法。

public interface ConfigAttribute extends Serializable {
    
	String getAttribute();

}

在 Spring Security 中,用户请求一个资源(通常是一个网络接口或者一个Java方法)所需要的角色会被封装成一个 ConfigAttribute 对象,在 ConfigAttribute 中只有一个 getAttribute 方法,该方法返回一个 String 字符串,就是角色的名称,角色名称都带有一个 ROLE_ 前缀,投票器 AccessDecisionVoter 所做的事情,其实就是比较用户所具备的角色和请求某个资源所需的 ConfigAttribute 之间的关系。

二、总结

了解 Spring Security 的整体架构,主要是为了后续了解其内部原理做准备。Spring Security 作为一个安全框架,其主要就是认证和授权两大结构。

认证(Authentication)的用户信息是间接的保存在 SecurityContextHolder中,在认证管理(AuthenticationManager)中管理着多个认证执行器,由它们进行认证,认证的有关详情被封装在Authenticatoin中。

授权(Authorization)中权限名可通过ConfigAttribute通过getAttribute方法进行获取,通过AccessDecisionManager判断访问是否允许,而判断的依据是AccessDecisionVoter的投票vote方法的结果。文章来源地址https://www.toymoban.com/news/detail-463227.html

到了这里,关于【深入浅出Spring Security(一)】Spring Security的整体架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深入浅出 Spring Security(十三)】使用 JWT 进行前后端分离认证(附源码)

    JWT 全称 Java web Token,在此所讲述的是 JWT 用于身份认证,用服务器端生成的JWT去替代原始的Session认证,以提高安全性。 JWT本质是一个Token令牌,是由三部分组成的字符串,分别是头部(header)、载荷(payload)和签名(signature)。头部一般包含该 JWT 的基本信息,例如所使用的

    2024年02月12日
    浏览(38)
  • 【深入浅出 Spring Security(四)】登录用户数据的获取,超详细的源码分析

    在【深入浅出Spring Security(一)】Spring Security的整体架构 中叙述过一个SecurityContextHolder 这个类。说在处理请求时,Spring Security 会先从 Session 中取出用户登录数据,保存到 SecurityContextHolder 中,然后在请求处理完毕后,又会拿 SecurityContextHolder 中的数据保存到 Session 中,然后再

    2024年02月07日
    浏览(43)
  • 【深入浅出 Spring Security(十一)】授权原理分析和持久化URL权限管理

    在 【深入浅出Spring Security(一)】Spring Security的整体架构 中小编解释过授权所用的三大组件,在此再解释说明一下(三大组件具体指:ConfigAttribute、AccessDecisionManager(决策管理器)、AccessDecisionVoter(决策投票器)) ConfigAttribute 在 Spring Security 中,用户请求一个资源(通常是

    2024年02月10日
    浏览(54)
  • 这篇深入浅出贴 助你早日实现Stable diffusion自由

    我也不想标题党,可它们就是好萌啊!看看下面这些你认识多少? 我是憨憨,一个不会画画的设计师。过去半年里,AI绘画曾经多次引爆公众讨论,网络上那些精致的二次元同人插画、堪比真人的AI穿搭博主、打破次元壁的赛博Coser……背后都有一个“幕后黑手” —— Stable

    2024年02月21日
    浏览(34)
  • 糟了糟了,总部被SD画完都Q了,这篇深入浅出贴助你早日实现Stable Diffusion自由

    我也不想标题党,可乐高积木版的总部大楼就是好萌啊! 我是憨憨,一个不会画画的设计师。过去半年里,AI绘画曾经多次引爆公众讨论,网络上那些精致的二次元同人插画、堪比真人的AI穿搭博主、打破次元壁的赛博Coser……背后都有一个“幕后黑手” —— Stable Diffusion,其

    2024年02月12日
    浏览(35)
  • 深入浅出 -- 系统架构之单体架构

    单体架构(Monolithic Architecture)是一种传统的软件架构模式,将整个应用程序作为一个单一的、统一的单元进行开发、部署和扩展。在单体架构中,所有的功能模块都被打包在一起,共享同一个代码库和数据库。 例如,在网上商城系统中,JavaWeb工程通常会被打成WA R包部署在

    2024年04月10日
    浏览(48)
  • 深入浅出MySQL - 架构与执行

    Photo by Merilin Kirsika Tedder from Pexels MySQL作为一个流行的开源关系型数据库管理系统,它可以运行在多种平台上,支持多种存储引擎,提供了灵活的数据操作和管理功能。MySQL的逻辑架构可以分为三层: 连接层 、 服务层 和 引擎层 ,下方是网上流传度很广的一张架构图。 需要注

    2024年02月09日
    浏览(46)
  • 深入浅出 -- 系统架构之微服务架构选型参考图

    技术选型架构图 是一个用于展示项目中所采用的各种技术和组件之间关系的图表。 它通常包括以下几个部分: 1. 项目名称和描述:简要介绍项目的背景和目标。 2. 技术栈:列出项目中使用的主要技术和工具,如编程语言、框架、数据库等。 3. 组件关系:用箭头表示各个组

    2024年04月09日
    浏览(48)
  • 深入浅出推荐系统(一):推荐系统基本架构

    过去八九年在广告、生活服务、电商等领域从事大数据及推荐系统相关工作,近来打算对过去的工作做一个系统性的梳理。一方面帮自己查缺补漏、进行更深入的学习;另一方面也希望能通过博客结交同好,增进交流。 这一博客系列以介绍推荐系统为主,会少量涉及广告系统

    2023年04月26日
    浏览(55)
  • 深入浅出:理解 RPC 和 Dubbo 架构

    Apache Dubbo是一款高性能的Java RPC框架.其前身是阿里巴巴公司开源的一个高性能,轻量级的开源Java RPC框架,可以和Spring框架无缝集成. Dubbo 官网 RPC介绍 Remote Procedure Call 远程过程调用,是分布式架构的核心,按响应方式分以下两种: 同步调用:客户端调用服务方方法,等待直到服务方返

    2023年04月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包