JAVA全系列 教程
3762个小节阅读:7092.6k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
xxxxxxxxxx
public static void checkJwt(String jwt) throws MalformedClaimException, JoseException {
/*
* 使用JwtConsumer builder构建适当的JwtConsumer,它将 用于验证和处理JWT。 JWT的具体验证需求是上下文相关的, 然而,
* 通常建议需要一个(合理的)过期时间,一个受信任的时间 发行人, 以及将你的系统定义为预期接收者的受众。
* 如果JWT也被加密,您只需要提供一个解密密钥对构建器进行解密密钥解析器。
*/
PublicKey publicKey1 = new RsaJsonWebKey(JsonUtil.parseJson(publicKey)).getRsaPublicKey();
JwtConsumer jwtConsumer = new JwtConsumerBuilder().setRequireExpirationTime()
.setAllowedClockSkewInSeconds(30) // 允许在验证基于时间的令牌时留有一定的余地,以计算时钟偏差。单位/秒
.setRequireSubject() // 主题声明
.setExpectedIssuer("Issuer") // JWT需要由谁来发布,用来验证 发布人
.setExpectedAudience("Audience") // JWT的目的是给谁, 用来验证观众
.setVerificationKey(publicKey1) // 用公钥验证签名 ,验证秘钥
.setJwsAlgorithmConstraints( // 只允许在给定上下文中预期的签名算法,使用指定的算法验证
new AlgorithmConstraints(ConstraintType.WHITELIST, // 白名单
AlgorithmIdentifiers.RSA_USING_SHA256))
.build(); // 创建JwtConsumer实例
try {
// 验证JWT并将其处理为jwtClaims
JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt);
// 如果JWT失败的处理或验证,将会抛出InvalidJwtException。
// 希望能有一些有意义的解释(s)关于哪里出了问题。
System.out.println("JWT validation succeeded! " + jwtClaims);
} catch (InvalidJwtException e) {
System.out.println("Invalid JWT! " + e);
// 对JWT无效的(某些)特定原因的编程访问也是可能的
// 在某些情况下,您是否需要不同的错误处理行为。
// JWT是否已经过期是无效的一个常见原因
if (e.hasExpired()) {
System.out.println("JWT expired at " + e.getJwtContext().getJwtClaims().getExpirationTime());
}
// 或者观众是无效的
if (e.hasErrorCode(ErrorCodes.AUDIENCE_INVALID)) {
System.out.println("JWT had wrong audience: " + e.getJwtContext().getJwtClaims().getAudience());
}
}
}
创建controller包,在controller里面新建AuthController接口。
xxxxxxxxxx
@RestController
public class AuthController {
@Autowired
SysLoginService sysLoginService;
@PostMapping("login")
public R<?> login(@RequestBody LoginBody form) throws MalformedClaimException, JoseException {
return sysLoginService.login(form.getUsername(), form.getPassword());
}
}
xxxxxxxxxx
package com.itbaizhan.domian;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* 统一结果返回集
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class R {
// 状态码
private int code;
// 返回信息
private String meg;
// 数据
private Object data;
public static R fail(String meg){
R r = new R();
r.setCode(500);
r.setMeg(meg);
return r;
}
public static R ok(Object data){
R r = new R();
r.setCode(200);
r.setMeg("sucess");
r.setData(data);
return r;
}
}
xxxxxxxxxx
package com.itbaizhan.service;
import com.alibaba.nacos.common.utils.StringUtils;
import com.itbaizhan.domian.LoginBodyDTO;
import com.itbaizhan.domian.R;
import com.itbaizhan.utils.JwtUtils;
import org.jose4j.lang.JoseException;
import org.springframework.stereotype.Service;
@Service
public class SysLoginService {
/**
* 登录
* @param loginBodyDTO
* @return
*/
public R login(LoginBodyDTO loginBodyDTO) throws JoseException {
// 1、用户名或者密码校验
if (StringUtils.isEmpty(loginBodyDTO.getUsername()) || StringUtils.isEmpty(loginBodyDTO.getPassword()) ){
return R.fail("用户名或者密码为空");
}
// 2、判断用户名和密码是否正确
//TODO 数据库操作
if (loginBodyDTO.getUsername().equals("admin")&& loginBodyDTO.getPassword().equals("123456")){
// 颁发登录token
String token = JwtUtils.sign(1001L, "admin");
return R.ok(token);
}else {
return R.fail("用户名或者密码不对");
}
}
}