
SpringSecurity的顶层脉络以及几个核心的类
用于构建对象的接口
定义能够与HttpServletRequest匹配的筛选器链。以便决定它是否适用于该请求
实现类: DefaultSecurityFilterChain
SpringSecurity进入流程
FilterChainProxy ->根据请求决定一个SecurityFilterChain ->执行SecurityFilterChain中的一系列过滤器
主要下面三个类:
所有SecurityConfigurer首先调用其init(SecurityBuilder)方法。在调用了所有init(SecurityBuilder)方法之后,将调用每个configure(SecurityBuild)方法
AbstractConfiguredSecurityBuilder是Spring Security Config对安全构建器SecurityBuilder的抽象基类实现。它继承自安全构建器SecurityBuilder的另外一个抽象基类实现AbstractSecurityBuilder。但不同的是,AbstractSecurityBuilder约定了SecurityBuilder构建的基本框架:最多被构建一次,而AbstractConfiguredSecurityBuilder在此基础上做了如下扩展:
允许将多个安全配置器SecurityConfigurer应用到该SecurityBuilder上;
定义了构建过程的生命周期(参考生命周期状态定义BuildState);
在生命周期基础之上实现并final了基类定义的抽象方法#doBuild,将构建划分为三个主要阶段#init,#configure,#performBuild;
对 #init/#configure阶段提供了实现;
对 #init/#configure阶段提供了前置回调#beforeInit/#beforeConfigure空方法供基类扩展;
#performBuild定义为抽象方法要求子类提供实现;
登记安全构建器工作过程中需要共享使用的一些对象。
performBuild
子类必须实现此方法来构建要返回的对象。返回: 要设置的对象,如果实现允许,则返回 null
postProcess
执行对象的后处理。默认是委托给 ObjectPostProcessor。参数:对象——要发布的对象返回:可能修改的要使用的对象
无法通过配置解决的可以自己实现这个接口。
小结SecurityBuilder用来构建安全对象,安全对象包括:HtpSecurity、FilterChainProxy、AuthenticationManager SecurityConfigurer用来配置安全对象构建器(SecurityBuilder) ,典型的有:FormLoginConfigurer、CsrfConfigurer等
代表身份验证请求的token或者经过身份验证的principal,一旦 AuthenticationManager.authenticate(Authentication) 方法处理了请求
主要方法
尝试对传递的 Authentication 对象进行身份验证,如果成功,则返回完全填充的 Authentication 对象(包括授予的权限)。 AuthenticationManager
必须遵守以下有关异常的约定:
如果帐户被禁用并且 AuthenticationManager 可以测试此状态,则必须抛出 DisabledException。
如果帐户被锁定并且 AuthenticationManager 可以测试帐户锁定,则必须抛出 LockedException。
如果提供了不正确的凭据,则必须抛出 BadCredentialsException。
虽然上述例外是可选的,但 AuthenticationManager 必须始终测试凭据。应测试异常,如果适用,则按上述顺序抛出(即,如果帐户被禁用或锁定,则立即拒绝身份验证请求并且不执行凭据测试过程)。这可以防止针对禁用或锁定的帐户测试凭据。
参数:认证——认证请求对象返回:一个完全认证的对象,包括凭证抛出:AuthenticationException——如果认证失败
SecurityBuilder 用来创建一个AuthenticationManager。允许轻松构建内存身份验证、LDAP 身份验证、基于 JDBC 的身份验证、添加 UserDetailsService 和添加 AuthenticationProvider。
重写了AbstractConfiguredSecurityBuilder中performBuild
是 AuthenticationManager 唯一具体的实现类,主要实现了 AuthenticationManager 接口中的 authenticate
被 ProviderManager 维护在属性中
主要实现类
第四节 UserDetailsService DaoAuthenticationProvider
从 UserDetailsService 检索用户详细信息的 AuthenticationProvider 实现
AbstractUserDetailsAuthenticationProvider重要方法:
authenticate:实现了 AuthenticationProvider 中的方法
默认不适用缓存,使用的是 session
认证没有抛出异常
UsernamePasswordAuthenticationFilterAbstractAuthenticationProcessingFilter
在 UsernamePasswordAuthenticationFilter 中重写了 attemptAuthentication 方法
FormLoginconfigurerAbstractAuthenticationFilterConfigurer
第五节 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