共计 2225 个字符,预计需要花费 6 分钟才能阅读完成。
1、前两个绿色的第一个:过滤器次要是用来校验用户名和明码信息,第二个查看申请头中是否有 basic 信息。
2、exceptionTranslationFilter 次要是用来过滤在这个流程中,抛出的异样该进行什么解决
3、FilterSecurityInterceptor 这个用来是读取你在 config(Http) 中所进行的配置
Security 可扩大的有
鉴权失败处理器
验证器
登录胜利处理器
投票器
自定义 token 解决过滤器
登出胜利处理器
登录失败处理器
自定义 UsernamePasswordAuthenticationFilter
鉴权失败处理器
Security 鉴权失败默认跳转登录页面,咱们能够实现 AccessDeniedHandler 接口,重写 handle() 办法来自定义解决逻辑;而后参考配置类阐明将处理器退出到配置当中。
验证器
实现 AuthenticationProvider 接口来实现本人验证逻辑。须要留神的是在这个类外面就算你抛出异样,也不会中断验证流程,而是算你验证失败,咱们由流程图晓得,只有有一个验证器验证胜利,就算验证胜利,所以你须要注意这一点。
登录胜利处理器
在 Security 中验证胜利默认跳转到上一次申请页面或者门路为“/”的页面,咱们同样能够自定义:继承 SimpleUrlAuthenticationSuccessHandler 这个类或者实现 AuthenticationSuccessHandler 接口。我这里倡议采纳继承的形式,SimpleUrlAuthenticationSuccessHandler 是默认的处理器,采纳继承能够符合里氏替换准则,进步代码的复用性和防止不必要的谬误。
投票器
投票器可继承 WebExpressionVoter 或者实现 AccessDecisionVoter 接口;WebExpressionVoter 是 Security 默认的投票器;我这里同样倡议采纳继承的形式;增加到配置的形式参考 上文;
留神:投票器 vote 办法返回一个 int 值;- 1 代表拥护,0 代表弃权,1 代表赞成;投票管理器收集投票后果,如果最终后果大于等于 0 则放行该申请。
自定义 token 解决过滤器
自定义 token 处理器继承自 OncePerRequestFilter 或者 GenericFilterBean 或者 Filter 都能够,在这个处理器外面须要实现的逻辑是:获取申请里的 token,验证 token 是否非法而后填充 SecurityContextHolder,尽管说过滤器只有增加在投票器之前就能够,但我这里还是倡议增加在 http.addFilterAfter(new MyFittler(), LogoutFilter.class);
登出胜利处理器
实现 LogoutSuccessHandler 接口,增加到配置的形式参考上文。
登录失败处理器
登录失败默认跳转到登录页,咱们同样能够自定义。继承 SimpleUrlAuthenticationFailureHandler 或者实现 AuthenticationFailureHandler,倡议采纳继承。
自定义 UsernamePasswordAuthenticationFilter
咱们自定义 UsernamePasswordAuthenticationFilter 能够极大进步咱们 Security 的灵活性(比方增加验证验证码是否正确的性能)。
咱们间接继承 UsernamePasswordAuthenticationFilter,而后在配置类中初始化这个过滤器,给这个过滤器增加登录失败处理器,登录胜利处理器,登录管理器,登录申请 url。
这里配置稍微简单,贴一下代码清单
初始化过滤器:
MyUsernamePasswordAuthenticationFilte getAuthenticationFilter(){
MyUsernamePasswordAuthenticationFilter myUsernamePasswordAuthenticationFilter = new MyUsernamePasswordAuthenticationFilter(redisService);
myUsernamePasswordAuthenticationFilter.setAuthenticationFailureHandler(new MyUrlAuthenticationFailureHandler());
myUsernamePasswordAuthenticationFilter.setAuthenticationSuccessHandler(new MyAuthenticationSuccessHandler());
myUsernamePasswordAuthenticationFilter.setFilterProcessesUrl("/sign_in");
myUsernamePasswordAuthenticationFilter.setAuthenticationManager(getAuthenticationManager());
return myUsernamePasswordAuthenticationFilter;
}
增加到配置:
http.addFilterAt(getAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class);