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;
}
}

浙公网安备 33010602011771号