生成Token
public UserVO login(String username, String password) {
try {
UserVO vo = new UserVO();
// 校验用户名密码
User user = this.userClient.queryUserByUsernameAndPassword(username, password);
Date expireDate = user.getExpireDate();
expire(expireDate,vo);
//判断是否是学生
if(user.getRoleId() == null || user.getRoleId() != 3){
//账号被停用
vo.setCode(501);
return vo;
}
if (user == null) {
return null;
}
if(1 == user.getSysState()){
//账号被停用
vo.setCode(500);
return vo;
}
// 生成token
UserInfo userInfo = new UserInfo();
userInfo.setId(user.getId());
String token = JwtUtils.generateToken(userInfo, prop.getPrivateKey(), prop.getExpire());
vo.setToken(token);
BeanUtils.copyProperties(user,vo);
// 返回
return vo;
} catch (Exception e) {
return null;
}
}
JwtUtils
package com.softdev.auth.utlis;
import com.softdev.auth.entity.JwtConstants;
import com.softdev.auth.entity.UserInfo;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.joda.time.DateTime;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.concurrent.TimeUnit;
/**
* @author: ly
* @create: 2018-05-26 15:43
**/
public class JwtUtils {
/**
* 私钥加密token
*
* @param userInfo 载荷中的数据
* @param privateKey 私钥
* @param expireMinutes 过期时间,单位秒
* @return
* @throws Exception
*/
public static String generateToken(UserInfo userInfo, PrivateKey privateKey, int expireMinutes) throws Exception {
return Jwts.builder()
.claim(JwtConstants.JWT_KEY_ID, userInfo.getId())
.claim(JwtConstants.JWT_KEY_USER_NAME, userInfo.getUsername())
.setExpiration(DateTime.now().plusMinutes(expireMinutes).toDate())
.signWith(SignatureAlgorithm.RS256, privateKey)
.compact();
}
/**
* 私钥加密token
*
* @param userInfo 载荷中的数据
* @param privateKey 私钥字节数组
* @param expireMinutes 过期时间,单位秒
* @return
* @throws Exception
*/
public static String generateToken(UserInfo userInfo, byte[] privateKey, int expireMinutes) throws Exception {
return Jwts.builder()
.claim(JwtConstants.JWT_KEY_ID, userInfo.getId())
.claim(JwtConstants.JWT_KEY_USER_NAME, userInfo.getUsername())
.setExpiration(DateTime.now().plusMinutes(expireMinutes).toDate())
.signWith(SignatureAlgorithm.RS256, RsaUtils.getPrivateKey(privateKey))
.compact();
}
public static String generateTokenInSeconds(UserInfo userInfo, PrivateKey privateKey, int expireSeconds) throws Exception {
return Jwts.builder()
.claim(JwtConstants.JWT_KEY_ID, userInfo.getId())
.claim(JwtConstants.JWT_KEY_USER_NAME, userInfo.getUsername())
.setExpiration(DateTime.now().plusSeconds(expireSeconds).toDate())
.signWith(SignatureAlgorithm.RS256, privateKey)
.compact();
}
/**
* 公钥解析token
*
* @param token 用户请求中的token
* @param publicKey 公钥
* @return
* @throws Exception
*/
private static Jws<Claims> parserToken(String token, PublicKey publicKey) {
return Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token);
}
/**
* 公钥解析token
*
* @param token 用户请求中的token
* @param publicKey 公钥字节数组
* @return
* @throws Exception
*/
private static Jws<Claims> parserToken(String token, byte[] publicKey) throws Exception {
return Jwts.parser().setSigningKey(RsaUtils.getPublicKey(publicKey))
.parseClaimsJws(token);
}
/**
* 获取token中的用户信息
*
* @param token 用户请求中的令牌
* @param publicKey 公钥
* @return 用户信息
* @throws Exception
*/
public static UserInfo getInfoFromToken(String token, PublicKey publicKey) throws Exception {
Jws<Claims> claimsJws = parserToken(token, publicKey);
Claims body = claimsJws.getBody();
return new UserInfo(
ObjectUtils.toLong(body.get(JwtConstants.JWT_KEY_ID)),
ObjectUtils.toString(body.get(JwtConstants.JWT_KEY_USER_NAME))
);
}
/**
* 获取token中的用户信息
*
* @param token 用户请求中的令牌
* @param publicKey 公钥
* @return 用户信息
* @throws Exception
*/
public static UserInfo getInfoFromToken(String token, byte[] publicKey) throws Exception {
Jws<Claims> claimsJws = parserToken(token, publicKey);
Claims body = claimsJws.getBody();
return new UserInfo(
ObjectUtils.toLong(body.get(JwtConstants.JWT_KEY_ID)),
ObjectUtils.toString(body.get(JwtConstants.JWT_KEY_USER_NAME))
);
}
public static void main(String[] args) throws Exception {
UserInfo userInfo = new UserInfo();
userInfo.setId(2L);
userInfo.setUsername("Jack");
// 私钥
// PrivateKey privateKey = RsaUtils.getPrivateKey("D:\\heima30\\rsa\\rsa.pri");
// 生成token
// String token = generateToken(userInfo, privateKey, 5);
// System.out.println(token);
// Thread.sleep(6000);
String token = "eyJhbGciOiJSUzI1NiJ9.eyJpZCI6NjY5LCJleHAiOjE1OTcxOTQwMDZ9.Zl3nPg4qkHtB2e9GZHJMffeGxiv27AtbH3DKR1SAC9A0q2xlRFFlM_N60RCKHIDLBHfyXjE8vMR7OAA1J8jXhspFceoPYtRApV1Q2IGLKuhA-PGlE1QoJ4Pz2_fzuwlN8UKq3ipJ4BE_gcKMDCUJp0Gt9gG4pXcOXINnYVN1ESU";
PublicKey publicKey = RsaUtils.getPublicKey("D:\\heima\\rsa\\rsa.pub");
UserInfo info = getInfoFromToken(token, publicKey);
System.out.println("info.getUsername() = " + info.getUsername());
}
}