本文只作为个人学习时的摘要,如果想具体的学习,可以翻到文章底部
正文:
上篇文章我们已经做好了使用jwt之前的一些准备,现在我们实现 登陆成功后返回jwt token对
思路:
定义两个处理器(失败,成功各一个),编写实现,注入ioc容器,并把他们写入 登录配置。
登陆成功处理器:
@Bean
public AuthenticationSuccessHandler authenticationSuccessHandler(JwtTokenGenerator jwtTokenGenerator) {
return (request, response, authentication) -> {
if (response.isCommitted()) {
log.debug("Response has already been committed");
return;
}
Map<String, Object> map = new HashMap<>(5);
map.put("time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
map.put("flag", "success_login");
User principal = (User) authentication.getPrincipal();
String username = principal.getUsername();
Collection<GrantedAuthority> authorities = principal.getAuthorities();
Set<String> roles = new HashSet<>();
if (CollectionUtil.isNotEmpty(authorities)) {
for (GrantedAuthority authority : authorities) {
String roleName = authority.getAuthority();
roles.add(roleName);
}
}
JwtTokenPair jwtTokenPair = jwtTokenGenerator.jwtTokenPair(username, roles, null);
map.put("access_token", jwtTokenPair.getAccessToken());
map.put("refresh_token", jwtTokenPair.getRefreshToken());
//ResponseUtil.responseJsonWriter(response, RestBody.okData(map, "登录成功"));
ResponseUtil.responseJsonWriter(response, setResultSuccess(map));
};
}
登陆失败处理器:
@Bean
public AuthenticationFailureHandler authenticationFailureHandler() {
return (request, response, exception) -> {
if (response.isCommitted()) {
log.debug("Response has already been committed");
return;
}
Map<String, Object> map = new HashMap<>(2);
map.put("time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
map.put("flag", "failure_login");
//ResponseUtil.responseJsonWriter(response, RestBody.build(HttpStatus.UNAUTHORIZED.value(), map, "认证失败","-9999"));
ResponseUtil.responseJsonWriter(response, setResultError(401,"认证失败",map));
};
}
写入登陆配置:
// 登录 成功后返回jwt token 失败后返回 错误信息
.formLogin().loginProcessingUrl(LOGIN_PROCESSING_URL).successHandler(authenticationSuccessHandler).failureHandler(authenticationFailureHandler)
启动项目,输入url:
http://localhost:8081/process?username=Felordcn&password=12345&login_type=0
可以看到
{
"code": 200,
"msg": "success",
"data": {
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhbGwiLCJyb2xlcyI6IltdIiwiaXNzIjoiZmVsb3JkLmNuIiwiYXVkIjoiRmVsb3JkY24iLCJleHAiOiIyMDIxLTA3LTIzIDExOjAxOjI2IiwiaWF0IjoiMjAyMS0wNi0yMyAxMTowMToyNiIsImp0aSI6IjVhNGE3Mzc4YzQ5NzQ1NmZhOWY3NWYzZjAyOTI0MjZiIn0.D3xFvPGJWFEoVCh7iYwRdg4Jw9xbkDSopGCFjYuWl1nBxWMdnuDkl7Z0Xg9-toJkTbV2VwL0eD7ar0vuvgRB0cvSPtlTf_AqMJyBamiN4goiM6jHVhtzzZ1LHvWhaN8QlwmEl3uqeRmhZCQwX3SORXxhHXinmW2JqBfpNnfJkv8",
"refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhbGwiLCJyb2xlcyI6IltdIiwiaXNzIjoiZmVsb3JkLmNuIiwiYXVkIjoiRmVsb3JkY24iLCJleHAiOiIyMDIxLTA5LTIxIDExOjAxOjI2IiwiaWF0IjoiMjAyMS0wNi0yMyAxMTowMToyNiIsImp0aSI6IjVhNGE3Mzc4YzQ5NzQ1NmZhOWY3NWYzZjAyOTI0MjZiIn0.hE2czN0yps8rBLy51Z-3ZPXVvMrS-LanJNQLQ2m6jtLcsWYpzOUf-y_lhDNCcgCLpgYKakpVAH4C6VXKLxKZcfNs5EN29caFNPoBhFtp4sb_9_w6fj6dGwR4M_WP-QV7SwPslgEg14p8GzelGYy54zCPHygHESaHfsYZTEcitf4",
"time": "2021-06-23 11:05:14",
"flag": "success_login"
}
}
文章相关代码转载来自 https://www.felord.cn/categories/spring-security/ ,感谢大佬的分享哈