1.前端账号密码数据通过请求体方式发送给后端接口
2.后端拿到账号密码进行校验
// 令牌自定义标识
@Value("${token.header}")
private String header;
// 令牌秘钥
@Value("${token.secret}")
private String secret;
// 令牌有效期
@Value("${token.expireTime}")
private int expireTime;
public void loginCheck(String username, String password)
{
//依据业务进行账号密码校验
//用户名密码校验成功后,生成token
//利用Spring Security框架封装用户信息
UsernamePasswordAuthenticationToken authenticationToken = new
UsernamePasswordAuthenticationToken(username, password);
//讲封装的信息设置存储当前安全上下文
AuthenticationContextHolder.setContext(authenticationToken);
//AuthenticationManager是Spring Security中用于处理身份验证请求的接口。它接收一个Authentication对象(此是一个UsernamePasswordAuthenticationToken),认证成功authenticate方法会返回一个填充了用户权限和其他详细信息的Authentication对象
authentication = authenticationManager.authenticate(authenticationToken);
//认证失败抛出AuthenticationException
//成功后
authentication.getPrincipal();//获取当前用户主体信息
//生成token
createToken(loginUser);
}
//生成token
public String createToken(LoginUser loginUser)
{
String token = IdUtils.fastUUID();
loginUser.setToken(token);
refreshToken(loginUser);
Map<String, Object> claims = new HashMap<>();
claims.put(Constants.LOGIN_USER_KEY, token);
return createToken(claims);
}
private String createToken(Map<String, Object> claims)
{
String token = Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS512, secret).compact();
return token;
}
//刷新token
public void refreshToken(LoginUser loginUser)
{
loginUser.setLoginTime(System.currentTimeMillis());
loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
// 根据uuid将loginUser缓存
String userKey = getTokenKey(loginUser.getToken());
redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
}
3.用户信息存放redis中
public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
{
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
}