hooyantsing's Blog

P9_1-6-1-自定义登录认证成功结果处理

字数统计: 469阅读时长: 2 min
2020/07/22

1.6.1.自定义登录认证成功结果处理

SpringSecurity-Social-OAuth2社交登录接口授权鉴权系列课程(持续更新)Spring Security、Spring Boot、Java

自定义登录验证结果处理的场景

  • 不同的人登陆后,看到不同的首页

  • 前后端分离的应用,期望响应结果是JSON,而不是html页面
    如果想实现复杂的登录成功/失败的逻辑,需要实现以下接口

  • 登录成功的自定义结果处理接口:AuthenticationSuccessHandler

  • 登录失败的自定义结果处理接口:AuthenticationfailureHandler

    自定义登录认证成功

  1. 理应实现 AuthenticationSuccessHandler 接口。
  2. 然而继承 SavedRequestAwareAuthenticationSuccessHandler 效果更好,它实现了一些默认的方法,它同样实现了 AuthenticationSuccessHandler 接口。
    自定义登陆成功处理逻辑,可以选择以 JSON 格式返回数据,也可以跳转回上一个页面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package xyz.hooy.demo.config.auth;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
import xyz.hooy.demo.config.exception.AjaxResponse;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class MySuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
// 理应实现 AuthenticationSuccessHandler 接口。
// 然而继承 SavedRequestAwareAuthenticationSuccessHandler 效果更好,它实现了一些默认的方法,它同样实现了 AuthenticationSuccessHandler 接口。

@Value("${spring.security.loginType}")
private String loginType;

// Object -> json
private static ObjectMapper objectMapper = new ObjectMapper();

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
if(loginType.equalsIgnoreCase("JSON")){
// 以json格式返回数据
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(objectMapper.writeValueAsString(AjaxResponse.success()));
} else {
// 默认,跳回登录前的页面
super.onAuthenticationSuccess(request,response,authentication);
}

}

}

然后,在 SecurityConfig(Security的配置类) 使用。

注意:defaultSuccessUrl(默认登录成功跳转方法) 和 successHandler(自定义登录认证成功方法) 是互斥的,二者选其一,不能同时存在。

375b310773d755f5780bb0329a04cda6.png

CATALOG
  1. 1. 1.6.1.自定义登录认证成功结果处理
    1. 1.0.1. 自定义登录认证成功