4.登录后返回 JWT Token

 本文只作为个人学习时的摘要,如果想具体的学习,可以翻到文章底部

正文:

上篇文章我们已经做好了使用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/ ,感谢大佬的分享哈 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

65页ppt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值