在我以前的文章中,作过登陆验证流程的源码解析。其中比较重要的就是html
可是在web应用开发过程当中需求是变幻无穷的,有时须要咱们针对登陆结果作个性化处理,好比:web
以上的这些状况,使用Spring Security做为安全框架的时候,都须要咱们使用本节学到的知识进行自定义的登陆验证结果处理。spring
为了知足上面的需求,咱们该如何去作呢?下面一小节咱们来讲明一下。AuthenticationSuccessHandler接口是Security提供的认证成功处理器接口,咱们只须要去实现它便可。可是一般来讲,咱们不会直接去实现AuthenticationSuccessHandler接口,而是继承SavedRequestAwareAuthenticationSuccessHandler 类,这个类会记住用户上一次请求的资源路径,好比:用户请求books.html,没有登录因此被拦截到了登陆页,当你万成登录以后会自动跳转到books.html,而不是主页面。json
@Component public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { //在application配置文件中配置登录的类型是JSON数据响应仍是作页面响应 @Value("${spring.security.logintype}") private String loginType; private static ObjectMapper objectMapper = new ObjectMapper(); @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException { if (loginType.equalsIgnoreCase("JSON")) { response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(objectMapper.writeValueAsString(AjaxResponse.success())); } else { // 会帮咱们跳转到上一次请求的页面上 super.onAuthenticationSuccess(request, response, authentication); } } }
这里咱们一样没有直接实现AuthenticationFailureHandler接口,而是继承SimpleUrlAuthenticationFailureHandler 类。该类中默认实现了登陆验证失败的跳转逻辑,即登录失败以后回到登陆页面。咱们能够利用这一点简化咱们的代码。后端
@Component public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { //在application配置文件中配置登录的类型是JSON数据响应仍是作页面响应 @Value("${spring.security.logintype}") private String loginType; private static ObjectMapper objectMapper = new ObjectMapper(); @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { if (loginType.equalsIgnoreCase("JSON")) { response.setContentType("application/json;charset=UTF-8"); response.getWriter().write( objectMapper.writeValueAsString( AjaxResponse.error( new CustomException( CustomExceptionType.USER_INPUT_ERROR, "用户名或密码存在错误,请检查后再次登陆")))); } else { response.setContentType("text/html;charset=UTF-8"); super.onAuthenticationFailure(request, response, exception); } } }
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Resource private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler; @Resource private MyAuthenticationFailureHandler myAuthenticationFailureHandler; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() //禁用跨站csrf攻击防护,后面的章节会专门讲解 .formLogin() .successHandler(myAuthenticationSuccessHandler) .failureHandler(myAuthenticationFailureHandler) .defaultSuccessUrl("/index")//登陆认证成功后默认转跳的路径 .failureUrl("/login.html") //登陆认证是被跳转页面 }
而且配置defaultSuccessUrl和failureUrl安全
本文转载注明出处(必须带链接,不能只转文字):字母哥博客。springboot