spring security 实现自定义认证和登录(3):使用JWT生成token返回给用户

前面我们已经实现了登录,为了验证用户日后的请求是否有效,我们生成一个token给用户,用户将token保存起来,用户每次发送请求时我们验证其token是否有效,下面使用JWT生成token并返回给用户。

1. 添加JWT依赖

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.13</version>
        </dependency>

2. 使用JWT生成Token

由下图可以看出,JWT主要有三部分组成,其中的payloadsignatrue是我们要提供的,payload就是一些键值对,里面可以存放用户信息,signatrue就是一个签名算法。


在这里插入图片描述



    @Resource
    AuthenticationManager authenticationManager;

    @PostMapping("/login2")
    public String login(@ModelAttribute LoginParams loginParams){

        //1. 创建一个UsernamePasswordAuthenticationToken
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(loginParams.getUsername(), loginParams.getPassword());

        //2. 使用authenticationManager进行认证
        Authentication authentication = authenticationManager.authenticate(usernamePasswordAuthenticationToken);

        //3. 检查是否认证成功:null就是不成功
        if(authentication == null) return "failed";

        //使用jwt工具生成token
        MyUserDetails userDetails = (MyUserDetails) authentication.getPrincipal();
        Map<String, Object> payload = new HashMap<>();
        payload.put("username", userDetails.getUsername());
        JWTSigner jwtSigner = JWTSignerUtil.hs512("testttttt".getBytes(StandardCharsets.UTF_8));
        String token = JWTUtil.createToken(payload, jwtSigner);
        return token;
}

使用postman进行测试,成功返回token:

在这里插入图片描述

3. 验证token的有效性


    @Test
    void varifyToken() {
        //验证token的有效性
        String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ1c2VybmFtZSI6InRlc3QgdXNlcm5hbWUifQ.Sr21-L8xR0trhJdDE8aBNHvl_2BXkqZQRcpTTIaPJ37FxBfqeSFeGqvaWZ5CrLXkZVwW9rE9lPBuZ3wH3PZqnw";
        JWTSigner jwtSigner = JWTSignerUtil.hs512("testttttt".getBytes(StandardCharsets.UTF_8));
        Boolean verify1 = JWTUtil.verify(token, jwtSigner);
        log.info(verify1.toString());
        
        //取出token里的信息
        String username = (String)JWTUtil.parseToken(token).getPayload("username");
        log.info("username = {}", username);
}

注意,其中的签名算法要和你当初生成token时的签名算法及其密钥一样。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值