Spring Security源码(一):认证、授权、过滤器链
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security源码(一):认证、授权、过滤器链相关的知识,希望对你有一定的参考价值。
参考技术A 因为看了很多博客,发现很多人的使用风格都不一样,有点懵。感觉最好的方法就是多看一些源码,然后自己选择想要的使用方式。
spring security版本:2.1.6.RELEASE
这里先讲这三种的关系
AuthenticationManager、ProviderManager、AuthenticationProvider
封装了用户身份信息
一个接口,只有一个方法
ProviderManager是AuthenticationManager的实现类,提供了基本认证实现逻辑和流程;
先看这个方法这个方法,是 用来认证 的方法
关键点
AuthenticationProvider 本身也就是一个 接口 ,它有实现类 AbstractUserDetailsAuthenticationProvider 和AbstractUserDetailsAuthenticationProvider的 子类DaoAuthenticationProvider
只有 两个 方法
总结
这是一个抽象类,是 模板模 式。定义好了认证流程,我们去实现流程中的一些 环节 方法。达到了 自定义认证 的效果
AbstractUserDetailsAuthenticationProvider 的子类,实现了一些 抽象方法
retrieveUser
主要就是用 UserDetailsService 去查找用户
additionalAuthenticationChecks
createSuccessAuthentication
本质还是调用了父类的方法,就是新建了一个Authentication,然后将 UserDetails 的 信息 传递过去
UserDetailsService是一个接口,提供了一个方法
感觉这个接口没什么用,就是用来管理用户类的
SS在http后台中起作用主要是基于 Servlet Filters 的,我们先来看看什么是 Filter 是如何作用在 Servlet 中的。
springSecurityFilterChain 是个接口 , DefaultSecurityFilterChain 是它的实现类,而DefaultSecurityFilterChain 内部存在这一个 Filters 列表 ,关于SS中的过滤器和他们的执行顺序(Order)可以查看 官方文档 ,当我们需要自定义Filter的时候就会用到。 当请求到来时,在 ss 里边的 Filter就会作用请求,如下图 :
在上面我们说到了SS有 自己的一条过滤器链 ,下面就是截图:(执行顺序就是集合中的顺序)
下面说一下几个 比较重要的 Filter 的 处理逻辑
整个调用流程是,先调用其父类 AbstractAuthenticationProcessingFilter.doFilter() 方法,然后再执行 UsernamePasswordAuthenticationFilter.attemptAuthentication() 方法进行验证;
父类是 AbstractAuthenticationProcessingFilter (又是模板模式,子类实现抽象方法,父类定好流程)
requiresAuthentication
判断是否需要当前filter处理,就是判断路径、请求方法等等
以UsernamePasswordAuthenticationFilter的构造方法为例
successfulAuthentication
这里的认证就是 第一节的内容 ( this.getAuthenticationManager().authenticate(authRequest) )
从上图中过滤器的执行顺序图中可以看出 AnonymousAuthenticationFilter 过滤器是在UsernamePasswordAuthenticationFilter 等过滤器之后 ,如果它前面的过滤器 都没有认证成功 ,Spring Security则为当前的SecurityContextHolder中添加一个Authenticaiton 的匿名实现类 AnonymousAuthenticationToken;
总结
ExceptionTranslationFilter 异常处理过滤器,该过滤器用来处理在系统 证授权过程 中抛出的异常(也就是下一个过滤器FilterSecurityInterceptor),主要是 处理 AuthenticationException 和 AccessDeniedException 。
此过滤器为认证授权过滤器链中 最后一个过滤器 ,该过滤器之后就是请求真正的 /xx服务
Spring Security默认使用 AffirmativeBased 实现 AccessDecisionManager 的 decide 方法来实现授权
到此位置 authentication 当前用户信息,fl当前访问的 资源路径及attributes当前资源路径的决策 (即是否需要认证)。剩下就是 判断 当前用户的角色Authentication.authorites 是否权限 访问决策访问当前资源fi
Spring Security 核心过滤器链分析
以上是关于Spring Security源码(一):认证、授权、过滤器链的主要内容,如果未能解决你的问题,请参考以下文章