SpringBoot使用Jwt做身份签名(以用户登录为例)

1.在pom.xml中引入相关依赖

<!-- JWT API -->  
<dependency>  
    <groupId>io.jsonwebtoken</groupId>  
    <artifactId>jjwt-api</artifactId>  
    <version>0.12.7</version>  
</dependency>  
  
<!-- JWT 实现 -->  
<dependency>  
    <groupId>io.jsonwebtoken</groupId>  
    <artifactId>jjwt-impl</artifactId>  
    <version>0.12.7</version>  
    <scope>runtime</scope>  
</dependency>  
  
<!-- JSON 序列化(Jackson) -->  
<dependency>  
    <groupId>io.jsonwebtoken</groupId>  
    <artifactId>jjwt-jackson</artifactId>  
    <version>0.12.7</version>  
    <scope>runtime</scope>  
</dependency>

2.配置application.yaml

新增以下内容,与spring平级

jwt:  
  secret: MyJwtSecretKeyForDeviceUsageTime2026  #这里换成你自己的key,开发环节推荐使用env文件,生产环节推荐引入在线环境变量或本地环境变量
  expiration: 86400000

3.配置Config(作用不明?说是方便统一管理?)

config包下新建JwtConfig.java

@Data  
@Configuration  
public class JwtConfig {  
    @Value("${jwt.secret}")  
    private String secret;  
  
    @Value("${jwt.expiration}")  
    private Long expiration;  
}

4.创建util

@Component  
public class JwtUtil {  
    // 设置秘钥  
    @Value("${jwt.secret}")  
    private String SECRET;  
  
    @Value("${jwt.expiration}")  
    private int EXPRIATION;  
  
    // 转换秘钥类型  
    private SecretKey SECRET_KEY;  
  
    //使用此注解可以使SpringBoot在Bean创建完成后执行该方法  
    @PostConstruct  
    private void init(){  
        SECRET_KEY = Keys.hmacShaKeyFor(  
                SECRET.getBytes(StandardCharsets.UTF_8)  
        );  
    }  
  
    /**  
     * 根据用户邮箱 ,生成唯一token  
     * @param user_email 用户邮箱  
     * @return 类型为String的token  
     */    public String generate(String user_email){  
  
        return Jwts.builder()  
                //设置主题,一般以主键作为主题,因为唯一  
                .subject(user_email)  
  
                //设置过期时间  
                .expiration(new Date(  
                        System.currentTimeMillis()+EXPRIATION))  
                // 将Jwt签名。因为Jwt不是加密,而是签名  
                .signWith(SECRET_KEY)  
                // 编码生成最终数据  
                .compact();  
    }  
}

5.创建Controller

// 登录  
@PostMapping("/login")  
public Result login(@RequestBody LoginDTO loginDTO){  
    String token = loginServer.login(loginDTO);  
    return Result.success("登录成功",token);  
}

6.创建Server

@Slf4j  
@Service  
public class LoginServer implements LoginServerImpl {  
    @Autowired  
    UserAuthMapper userAuthMapper;  
    @Autowired  
    PasswordEncoder passwordEncoder;  
    @Autowired  
    JwtUtil jwtUtil;  
  
    /**  
     * 用户登录,检验密码是否正确,检验成功则返回token记住用户  
     * @param loginDTO 用户登录时需要传入的数据,包含用户名和密码  
     * @return 返回一个jwt的token,类型为String  
     */    @Override  
    public String login(LoginDTO loginDTO) {  
        //根据用户邮箱拿到用户实体类  
        UserAuthEntity user = userAuthMapper.selectUserInfo(loginDTO.getUser_email());  
        if(user == null){  
            throw new RuntimeException("用户不存在");  
        }  
  
        if(!passwordEncoder.matches(loginDTO.getUser_password(), user.getUser_password())){  
            //记录日志  
            log.info(loginDTO.getUser_email()+"输入密码错误");  
            throw new RuntimeException("密码错误");  
        }  
  
        // 密码正确时,允许登录,给浏览器返回一个tokken  
        return jwtUtil.generate(loginDTO.getUser_email());  
    }  
  
    /**  
     * 根据用户token删除对应信息以此实现退出登录  
     * @param token 用户token  
     */    @Override  
    public void logout(String token) {  
        //检查用户token是否存在。若存在则删除。若存在,则删除,并记录日志。若不存在,则记录日志。  
        return;  
    }  
}
posted @ 2026-07-22 00:21  畅畅c  阅读(6)  评论(0)    收藏  举报