sandu-common/src/main/java/com/sandu/common/security/token/JwtTokenProvider.java
@@ -1,14 +1,19 @@ package com.sandu.common.security.token; import com.sandu.common.enums.AdminStatusStatus; import com.sandu.common.execption.BusinessException; import com.sandu.common.redis.RedisService; import com.sandu.common.security.LoginUserInfo; import com.sandu.common.security.config.SecurityProperties; import com.sandu.common.util.SpringContextHolder; import io.jsonwebtoken.*; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.io.DecodingException; import io.jsonwebtoken.security.Keys; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.autoconfigure.cache.CacheProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Component; @@ -47,14 +52,14 @@ if (loginUserInfo.getUserId() == null) { throw new IllegalArgumentException("用户id不能为空"); } RedisService redisService = SpringContextHolder.getBean(RedisService.class); String authorities = loginUserInfo.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.joining(",")); long now = (new Date()).getTime(); Date expiration = new Date(now + properties.getTokenValidityInSeconds()); return Jwts.builder() String token = Jwts.builder() .setSubject(loginUserInfo.getUserId().toString()) .claim(AUTHORITIES_KEY, authorities) .claim(CREDENTIALS_KEY, loginUserInfo.getAccount()) @@ -62,11 +67,17 @@ .setExpiration(expiration) .signWith(key, SignatureAlgorithm.HS512) .compact(); String key = String.format("%d_%d", loginUserInfo.getUserId(), loginUserInfo.getAdministratorType()); redisService.set(key, token); return token; } @Override public LoginUserInfo validateToken(String token) { try { RedisService redisService = SpringContextHolder.getBean(RedisService.class); Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody(); LoginUserInfo loginUserInfo = new LoginUserInfo(); loginUserInfo.setUserId(Long.valueOf(claims.getSubject())); @@ -75,6 +86,11 @@ loginUserInfo.setAdministratorType(Integer.parseInt(claims.get(ADMINISTRATOR_KEY).toString())); loginUserInfo.setToken(token); loginUserInfo.setStatus(AdminStatusStatus.NORMAL.getCode()); String key = String.format("%d_%d", loginUserInfo.getUserId(), loginUserInfo.getAdministratorType()); String redisToken = String.valueOf(redisService.get(key)); if (redisToken == null || !token.equals(redisToken)) { throw new BusinessException("token无效"); } return loginUserInfo; } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) { log.info("Invalid JWT signature."); sandu-common/src/main/java/com/sandu/common/security/token/RedisTokenProvider.java
@@ -27,8 +27,8 @@ String token = IdUtil.simpleUUID(); loginUserInfo.setToken(token); loginUserInfo.setCreateTimestamp(System.currentTimeMillis()); redisService.set(UserModel.USER_TOKEN.key(token), loginUserInfo.getUserId(), UserModel.USER_TOKEN.expireSeconds()); redisService.set(UserModel.USER_INFO.key(loginUserInfo.getUserId().toString()), loginUserInfo); redisService.set(UserModel.USER_TOKEN.key(token), loginUserInfo, UserModel.USER_TOKEN.expireSeconds()); redisService.set(UserModel.USER_INFO.key(loginUserInfo.getUserId().toString() + loginUserInfo.getAdministratorType()), loginUserInfo); return token; } @@ -37,11 +37,12 @@ if (token == null) { return null; } Long userId = (Long) redisService.get(UserModel.USER_TOKEN.key(token)); if (userId == null) { LoginUserInfo loginUserInfo = (LoginUserInfo) redisService.get(UserModel.USER_TOKEN.key(token)); if (loginUserInfo == null) { return null; } LoginUserInfo userInfo = (LoginUserInfo) redisService.get(UserModel.USER_INFO.key(userId.toString())); LoginUserInfo userInfo = (LoginUserInfo) redisService.get(UserModel.USER_INFO.key(loginUserInfo.getUserId().toString() + loginUserInfo.getAdministratorType().toString())); if (userInfo != null) { if (redisService.getExpire(token) < UserModel.USER_TOKEN.expireSeconds()) { redisService.expire(token, UserModel.USER_TOKEN.expireSeconds()); ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java
@@ -10,6 +10,8 @@ import com.sandu.common.execption.BusinessException; import com.sandu.common.log.Log; import com.sandu.common.object.BaseConditionVO; import com.sandu.common.redis.RedisService; import com.sandu.common.redis.UserModel; import com.sandu.common.security.LoginUserInfo; import com.sandu.common.security.annotation.AnonymousAccess; import com.sandu.common.security.config.SecurityProperties; @@ -59,6 +61,7 @@ private final TokenProvider tokenProvider; private final AdminRoleRelationService adminRoleRelationService; private PermissionConfig permissionConfig; private final RedisService redisService; @Log("后台用户登录") @AnonymousAccess @@ -144,6 +147,17 @@ return ResponseUtil.success(builder.build()); } @GetMapping(value = "/logout") public ResponseVO<Object> LogOut() { // redisService.set(UserModel.USER_INFO.key(SecurityUtils.getUserId().toString() + SecurityUtils.getUserDetails().getAdministratorType()), null); // redisService.set(UserModel.USER_TOKEN.key(UserModel.USER_TOKEN.key(SecurityUtils.getUserDetails().getToken())), null); String key = String.format("%d_%d", SecurityUtils.getUserDetails().getUserId(), SecurityUtils.getUserDetails().getAdministratorType()); redisService.set(key, null); return ResponseUtil.success("退出登录成功"); } private MenuNode covertMenuNode(Menu menu, List<Menu> menuList) { MenuNode node = new MenuNode(); BeanUtils.copyProperties(menu, node);