Spring Security核心原理
spring security 是由一系列的过滤器连构成,主要包行 SpringSecurityContextFilter、UsernamePasswordAuthenticationFilter、ExceptionTranslationFilter、FilterSecurityIntercepor等;
一、核心过滤器
- SpringSecurityContextFilter,主要是保存当前请求信息,当一个请求经过过滤器连时,SpringSecurityContextFilter先从session中尝试获取SecurityContext(安全上下文),如果不存在,则创建一个安全上下文;当请求结束后,SpringSecurityContextFilter会清空安全上下文信息;
- UsernamePasswordAuthenticationFilter主要负责表单认证,当请求经过UsernamePasswordAuthenticationFilter时,用户传来的用户名和密码将被封装成token并进行一系列认证;
- ExceptionTranslationFilter负责异常处理,主要捕获的异常包括认证异常(AuthenticationException)和访问拒绝异常(AccessDeniedException);
- FilterSecurityInterceptor主要负责授权处理,当请求经过FilterSecurityInterceptor时,系统将从安全上下文中获取Authentication对象进行权限判断;
二、认证流程
用户提交用户名和密码请求服务器时,UsernamePasswordAuthenticationFilter将帐号密码封装成UsernamePasswordAuthenticationToken, 并委托给认证管理器AuthenticationManager进行认证;AuthenticationManager再次委托给DaoAuthenticationProvider进行认证;DaoAuthenticationProvider通过用户名从UserDetailService中获取UserDetails用户信息,然后通过PasswordEncoder来对比UserDetails中的密码;如果校验通过,则将UserDetails中的权限信息等填充到SessionAuthenticationStrategey 和 安全上下文SecurityContext中。
三、授权流程
当通过认证后,用户访问受保护的资源时,请求将被FilterSecurityInterceptor拦截器拦截,拦截器会从SecurityMetadataSoucrce的子类DefaultFilterInvocationSecurityMetadataSource中获取当前资源所需的权限集合;然后FilterSecurityInterceptor会调用AccessDecisionManager进行投票决策,若决策通过则允许访问资源,否则禁止访问。
四、实践加深理解
实践参考下一篇文章: https://blog.csdn.net/GeeLoong/article/details/122517674