萱草|记一次token安全认证的实践( 二 )


//获取生成token
Mapmap=newHashMap<>();
//建立载荷 , 这些数据根据业务 , 自己定义 。
map.put("uid",uid);
map.put("deptId",deptId);
map.put("userType",userType);
map.put("companyId",companyId);
//生成时间
map.put("sta",newDate().getTime());
//过期时间
map.put("exp",newDate().getTime()+1000*3600*24*15);
try{
Stringtoken=Token.creatToken(map);
System.out.println("token="+token);
returntoken;
}catch(JOSEExceptione){
System.out.println("生成token失败");
e.printStackTrace();
}
returnnull;
}
/**
*处理解析的业务逻辑gatewayJWT认证过滤器解析
*@paramtoken
*/
publicstaticMapValidToken(Stringtoken){
MapuserMsg=newHashMap();
//解析token
try{
if(token!=null){
MapvalidMap=Token.valid(token);
inti=(int)validMap.get("Result");
if(i==0){
log.info("token解析成功");
JSONObjectjsonObject=(JSONObject)validMap.get("data");
log.info("uid是:"+jsonObject.get("uid"));
log.info("deptId是:"+jsonObject.get("deptId"));
log.info("userType是:"+jsonObject.get("userType"));
log.info("companyId是:"+jsonObject.get("companyId"));
log.info("生成时间是:"+jsonObject.get("sta"));
log.info("过期时间是:"+jsonObject.get("exp"));
userMsg.put("token",token);
userMsg.put("uid",jsonObject.get("uid"));
userMsg.put("deptId",jsonObject.get("deptId"));
userMsg.put("companyId",jsonObject.get("companyId"));
userMsg.put("userType",jsonObject.get("userType"));
returnuserMsg;
}elseif(i==2){
log.info("token已经过期");
returnuserMsg;
}
}
}catch(ParseExceptione){
e.printStackTrace();
}catch(JOSEExceptione){
e.printStackTrace();
}
returnuserMsg;
}
publicstaticvoidmain(String[]ages){
//获取token
Longuid=1L;
LongdeptId=2L;
StringuserType="3";
intcompanyId=4;
Stringtoken=TokenTest(uid,deptId,userType,companyId);
//解析token
log.info(ValidToken(token).toString());
}
}
特别提示:以上工具类可以在用户登录授权接口中调用 , 用以生成token , 示例代码如下(可以借鉴不可复制哦 , 请根据自己业务逻辑在合适的地方调用TOKEN工具)
@RestController
@RequestMapping("/currency")
publicclassCurrencyLoginController{
//密钥(需要前端和后端保持一致)
privatestaticfinalStringKEY="abcdefgabcdefg12";
//redis初始KEY值
privatestaticfinalStringLOGIN_USER="login_user";
@Autowired
privateRedisUtilru;
@PostMapping("/login")
publicMapajaxLogin(Stringusername,Stringpassword,BooleanrememberMe)throwsException{
password=AESUtil.aesDecrypt(password,KEY);//双向加密规则
UsernamePasswordTokentoken=newUsernamePasswordToken(username,password,rememberMe);
Subjectsubject=SecurityUtils.getSubject();
try{
subject.login(token);
Useruser=ShiroUtils.getUser();
Stringaccess_token=Token.generateToken(user.getUserId(),user.getDeptId(),user.getLoginUserType(),user.getCompanyId());
UserMsgresultUser=newUserMsg();