总览
Spring Security 通过Filter来实现对web资源的访问控制
Spring 通过某些方式将DelegatingFilterProxy
作为Filter注册给Servlet容器, 执行doFilter方法时委派给从spring容器中获取的FilterChainProxy
处理(FilterChainProxy在配置类WebSecurityConfiguration中注入到spring容器中)。
FilterChainProxy
仅是一个代理,真正提供认证和授权这些功能的是FilterChainProxy
中SecurityFilterChain
包含的各个Filter(这些Filter已经注入到了Spring容器中)。这些Filter也不负责具体逻辑,认证和授权的具体逻辑交由认证管理器AuthenticationManager和决策管理器AccessDecisionManager处理。
Spring Security的功能实现主要由一系列过滤器链配合完成,项目启动时日志会打印Spring Security用到的Filter。
SecurityFilterChain中的Filter
-
SecurityContextPersistenceFilter:它在SecurityFilterChain中的顺序比较靠前,主要负责处理SecurityContextHolder
-
UsernamePasswordAuthenticationFilter:用于处理用户名密码这种方式的认证
认证成功后会发布
InteractiveAuthenticationSuccessEvent
事件,并且交由AuthenticationSuccessHandler
处理
认证失败会交由AuthenticationFailureHandler
处理,可自定义 -
FilterSecurityIntercepter:用于权限校验,使用AccessDecisionManager授权访问
-
ExceptionTranslationFilter: 捕获FilterChain的所有的异常,只处理AuthenticationException和AccessDeniedException两种类型的异常,其他异常继续抛出
认证管理器AuthenticationManager
决策管理器AccessDecisionManager
认证
可向spring容器中注入自定义的UserDetailsService、PasswordEncoder实现自己的逻辑
授权
决策流程
spring security 内置了三个基于投票的实现类,分别是
AffirmativeBased 是Spring Security默认使用的投票方式(只要有一个投票通过,就表示通过)