Security 安全框架1
security
-
过滤器链
-
检查请求是否有请求信息-主要校验规则
-
UsernamePasswordAuthenticationFilter: 处理表单登录, 请求是否带用户名密码 -
BasicAuthenticationFilter: 是否有Basic码信息, 有会进行解码认证
-
FilterSecurityInterceptor: 最后一部, 决定当前请求能不能继续, 根据不过的原因会抛出异常.-
ExceptionTranslationFilter: 在前FilterSecurityInterceptor有一个ExceptionTranslationFilter会处理FilterSecurityInterceptor抛出的异常, 引到用户根据前面过滤器的信息处理异常. - security通过过滤器链判断用户是否授权, 读取HttpSecurity配置, 判断请求中是否携带信息, 选择需要执行的过滤器, 最后由
ExceptionTranslationFilter统一进行权限认证, 如果未通过, 则会抛出异常, 由ExceptionTranslationFilter统一进行异常处理, 最后将异常信息返回给前台.
-
如果自定义Security过滤器 就是添加绿色的部分。
2. 认证流程
-
认证流程处理说明
-
UsernamePasswordAuthenticationFilter: 登陆请求未认证状态进入, 设置账户密码, 还未获取权限, 设置一些用户信息IP SESSION -
AuthenticationManager: 负责收集所有AuthenticationProvider, 循环所有AuthenticationProvider获取是否支持, 挑出一个provider来获取用户认证 -
AuthenticationProvider: 真正校验的逻辑 -
UserDetailsService: 获取UserDetails获取权限信息返回给UsernamePasswordAuthenticationFilter, 成功SuccessHandler, 失败FailureHandler -
UserDetails:Authentication已认证
-
-
认证结果如何在多个请求间共享
-
SecurityContext: 在认证成功之前方式上下文 -
SecurityContextHolder: ThreadLocal(线程级环境变量)封装, 获取认证信息 -
SecurityContextPersisitenceFilter: 在整个过滤器链的最前面, request进来检查Session中是否有SecurityContext如果有放到SecurityContextHolder没有空过, response回来检查SecurityContextHolder是否有SecurityContext, 如果有放置到Session中, 没有空过;
-
-
获取认证用户信息
- SecurityContextHolder.getContext().getAuthentication(): 静态方法获取
- Controller接口方法参数: Authentication authentication Spring mvc会自动注入
- @AuthenticationPrincipal UserDetails userDetails: 使用朱姐@AuthenticationPrincipal UserDetails 只注入用户信息
源码地址:https://github.com/Artister/tutorials-java/tree/master/security