栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

SpringSecurity源码解析

Java 更新时间:发布时间: 百科书网 趣学号

第一节

SpringSecurity的顶层脉络以及几个核心的类

SecurityBuilder

用于构建对象的接口

HttpSecurity

WebSecurity

SecurityFilterChain

定义能够与HttpServletRequest匹配的筛选器链。以便决定它是否适用于该请求

实现类: DefaultSecurityFilterChain

FilterChainProxy

SpringSecurity进入流程

FilterChainProxy ->根据请求决定一个SecurityFilterChain ->执行SecurityFilterChain中的一系列过滤器

第二节

主要下面三个类:

HttpSecurity内幕

SecurityConfigurer

所有SecurityConfigurer首先调用其init(SecurityBuilder)方法。在调用了所有init(SecurityBuilder)方法之后,将调用每个configure(SecurityBuild)方法

AbstractConfiguredSecurityBuilder

AbstractConfiguredSecurityBuilder是Spring Security Config对安全构建器SecurityBuilder的抽象基类实现。它继承自安全构建器SecurityBuilder的另外一个抽象基类实现AbstractSecurityBuilder。但不同的是,AbstractSecurityBuilder约定了SecurityBuilder构建的基本框架:最多被构建一次,而AbstractConfiguredSecurityBuilder在此基础上做了如下扩展:

  • 允许将多个安全配置器SecurityConfigurer应用到该SecurityBuilder上;

  • 定义了构建过程的生命周期(参考生命周期状态定义BuildState);

  • 在生命周期基础之上实现并final了基类定义的抽象方法#doBuild,将构建划分为三个主要阶段#init,#configure,#performBuild;

    1. 对 #init/#configure阶段提供了实现;

    2. 对 #init/#configure阶段提供了前置回调#beforeInit/#beforeConfigure空方法供基类扩展;

    3. #performBuild定义为抽象方法要求子类提供实现;

  • 登记安全构建器工作过程中需要共享使用的一些对象。

performBuild

 子类必须实现此方法来构建要返回的对象。返回: 要设置的对象,如果实现允许,则返回 null

postProcess

执行对象的后处理。默认是委托给 ObjectPostProcessor。参数:对象——要发布的对象返回:可能修改的要使用的对象

 无法通过配置解决的可以自己实现这个接口。

小结

SecurityBuilder用来构建安全对象,安全对象包括:HtpSecurity、FilterChainProxy、AuthenticationManager SecurityConfigurer用来配置安全对象构建器(SecurityBuilder) ,典型的有:FormLoginConfigurer、CsrfConfigurer等

第三节

Authentication

代表身份验证请求的token或者经过身份验证的principal,一旦 AuthenticationManager.authenticate(Authentication) 方法处理了请求

主要方法

AuthenticationManager

 

尝试对传递的 Authentication 对象进行身份验证,如果成功,则返回完全填充的 Authentication 对象(包括授予的权限)。 AuthenticationManager

必须遵守以下有关异常的约定:

如果帐户被禁用并且 AuthenticationManager 可以测试此状态,则必须抛出 DisabledException。

如果帐户被锁定并且 AuthenticationManager 可以测试帐户锁定,则必须抛出 LockedException。

如果提供了不正确的凭据,则必须抛出 BadCredentialsException。

虽然上述例外是可选的,但 AuthenticationManager 必须始终测试凭据。应测试异常,如果适用,则按上述顺序抛出(即,如果帐户被禁用或锁定,则立即拒绝身份验证请求并且不执行凭据测试过程)。这可以防止针对禁用或锁定的帐户测试凭据。

参数:认证——认证请求对象返回:一个完全认证的对象,包括凭证抛出:AuthenticationException——如果认证失败

AuthenticationManagerBuilder

SecurityBuilder 用来创建一个AuthenticationManager。允许轻松构建内存身份验证、LDAP 身份验证、基于 JDBC 的身份验证、添加 UserDetailsService 和添加 AuthenticationProvider。

重写了AbstractConfiguredSecurityBuilder中performBuild

ProviderManager

是 AuthenticationManager 唯一具体的实现类,主要实现了 AuthenticationManager 接口中的 authenticate

AuthenticationProvider

被 ProviderManager 维护在属性中

主要实现类

 

第四节 UserDetailsService

DaoAuthenticationProvider

从 UserDetailsService 检索用户详细信息的 AuthenticationProvider 实现

AbstractUserDetailsAuthenticationProvider

重要方法: 

authenticate:实现了 AuthenticationProvider 中的方法 

默认不适用缓存,使用的是 session

认证没有抛出异常

UsernamePasswordAuthenticationFilter

AbstractAuthenticationProcessingFilter

 在 UsernamePasswordAuthenticationFilter 中重写了 attemptAuthentication 方法

FormLoginconfigurer

AbstractAuthenticationFilterConfigurer

 

第五节 SecurityContext

定义与当前执行线程关联的最小安全信息的接口。安全上下文存储在SecurityContextHolder中

SecurityContextHolder

将给定的SecurityContext与当前执行线程关联。

此类提供了一系列静态方法,这些方法委托给SecurityContextHolderStrategy的实例

默认策略为 ThreadLocalSecurityContextHolderStrategy

SecurityContextHolderStrategy

针对线程存储安全上下文信息的策略。首选策略由SecurityContextHolder加载。

主要策略:   ThreadLocalSecurityContextHolderStrategy

SecurityContextPersistenceFilter

使用请求之前从配置的SecurityContextRepository获得的信息填充SecurityContextHolder,并在请求完成并清除上下文保持器后将其存储回存储库中。默认情况下,它使用HttpSessionSecurityContextRepository

SecurityContextHolderFilter

使用SecurityContextRepository获取SecurityContext并在SecurityContextHolder上设置它的筛选器。除了SecurityContextRepository之外,这与SecurityContextPersistenceFilter类似。必须显式调用saveContext(SecurityContext、HttpServletRequest、Http ServletResponse)才能保存SecurityContext。这通过允许不同的身份验证机制单独选择是否应该持久化身份验证来提高效率并提供更好的灵活性。

SecurityContextRepository

用于在请求之间持久化SecurityContext的策略。

SecurityContextConfigurer

 

第六节 RememberMeAuthenticationFilter

        检测SecurityContext中是否没有Authentication对象,如果RememberMeServices实现请求,则使用remember-me身份验证令牌填充上下文。具体的RememberMeServices实现将有自己的Remember MeServices。此筛选器调用的autoLogin(HttpServletRequest,HttpServletResponse)方法。如果此方法返回一个非空的Authentication对象,它将被传递给AuthenticationManager,以便实现任何特定于身份验证的行为。生成的身份验证(如果成功)将放入SecurityContext中。如果身份验证成功,将向应用程序上下文发布InteractiveAuthenticationSuccessEvent。如果身份验证失败,则不会发布任何事件,因为这通常会通过AuthenticationManager特定的应用程序事件进行记录。通常,无论身份验证成功还是失败,都将允许请求继续

RememberMeAuthenticationProvider

RememberMeAuthenticatiorIToken

RememberMeConfigurer

RememberMeServices

由能够提供“记住我”服务的类实现。

SessionManagementConfigurer

SessionManagementFilter

SessionAuthenticationStrategy

SessionInformation

SessionRegistry

SessionInformationExpiredStrategy

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1077848.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号