From 131b6c120db336ca5c2052b877be90ee201614db Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期六, 13 一月 2024 09:24:51 +0800 Subject: [PATCH] 增加账户互踢 --- ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java | 132 +++++++++++++++++++++++++++---------------- 1 files changed, 83 insertions(+), 49 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java index 710b5d3..07ecf89 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -27,8 +28,7 @@ * @author ruoyi */ @Component -public class TokenService -{ +public class TokenService { // 浠ょ墝鑷畾涔夋爣璇� @Value("${token.header}") private String header; @@ -40,6 +40,10 @@ // 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛� @Value("${token.expireTime}") private int expireTime; + + // 鏄惁鍏佽璐︽埛澶氱粓绔悓鏃剁櫥褰曪紙true鍏佽 false涓嶅厑璁革級 + @Value("${token.soloLogin}") + private boolean soloLogin; protected static final long MILLIS_SECOND = 1000; @@ -55,23 +59,18 @@ * * @return 鐢ㄦ埛淇℃伅 */ - public LoginUser getLoginUser(HttpServletRequest request) - { + public LoginUser getLoginUser(HttpServletRequest request) { // 鑾峰彇璇锋眰鎼哄甫鐨勪护鐗� String token = getToken(request); - if (StringUtils.isNotEmpty(token)) - { - try - { + if (StringUtils.isNotEmpty(token)) { + try { Claims claims = parseToken(token); // 瑙f瀽瀵瑰簲鐨勬潈闄愪互鍙婄敤鎴蜂俊鎭� String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); String userKey = getTokenKey(uuid); LoginUser user = redisCache.getCacheObject(userKey); return user; - } - catch (Exception e) - { + } catch (Exception e) { } } return null; @@ -80,24 +79,40 @@ /** * 璁剧疆鐢ㄦ埛韬唤淇℃伅 */ - public void setLoginUser(LoginUser loginUser) - { - if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) - { + public void setLoginUser(LoginUser loginUser) { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { refreshToken(loginUser); } } + ///** + // * 鍒犻櫎鐢ㄦ埛韬唤淇℃伅 + // */ + //public void delLoginUser(String token) + //{ + // if (StringUtils.isNotEmpty(token)) + // { + // String userKey = getTokenKey(token); + // redisCache.deleteObject(userKey); + // } + //} + /** * 鍒犻櫎鐢ㄦ埛韬唤淇℃伅 */ - public void delLoginUser(String token) - { - if (StringUtils.isNotEmpty(token)) - { + public void delLoginUser(String token, String userId) { + if (StringUtils.isNotEmpty(token)) { String userKey = getTokenKey(token); redisCache.deleteObject(userKey); } + if (!soloLogin && StringUtils.isNotNull(userId)) { + String userIdKey = getUserIdKey(userId); + redisCache.deleteObject(userIdKey); + } + } + + private String getUserIdKey(String userId) { + return Constants.LOGIN_USERID_KEY + userId; } /** @@ -106,8 +121,7 @@ * @param loginUser 鐢ㄦ埛淇℃伅 * @return 浠ょ墝 */ - public String createToken(LoginUser loginUser) - { + public String createToken(LoginUser loginUser) { String token = IdUtils.fastUUID(); loginUser.setToken(token); setUserAgent(loginUser); @@ -124,40 +138,67 @@ * @param loginUser * @return 浠ょ墝 */ - public void verifyToken(LoginUser loginUser) - { + public void verifyToken(LoginUser loginUser) { long expireTime = loginUser.getExpireTime(); long currentTime = System.currentTimeMillis(); - if (expireTime - currentTime <= MILLIS_MINUTE_TEN) - { + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { refreshToken(loginUser); } } + + ///** + // * 鍒锋柊浠ょ墝鏈夋晥鏈� + // * + // * @param loginUser 鐧诲綍淇℃伅 + // */ + //public void refreshToken(LoginUser loginUser) + //{ + // loginUser.setLoginTime(System.currentTimeMillis()); + // String appUserType = loginUser.getUser().getAppUserType(); + // if(StringUtils.isNull(appUserType)) + // { + // loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // // 鏍规嵁uuid灏唋oginUser缂撳瓨 + // String userKey = getTokenKey(loginUser.getToken()); + // redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); + // } + // else + // { + // loginUser.setExpireTime(loginUser.getLoginTime() + 365*24*60 * MILLIS_MINUTE); + // // 鏍规嵁uuid灏唋oginUser缂撳瓨 + // String userKey = getTokenKey(loginUser.getToken()); + // redisCache.setCacheObject(userKey, loginUser, 365*24*60, TimeUnit.MINUTES); + // } + //} /** * 鍒锋柊浠ょ墝鏈夋晥鏈� * * @param loginUser 鐧诲綍淇℃伅 */ - public void refreshToken(LoginUser loginUser) - { + public void refreshToken(LoginUser loginUser) { loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 鏍规嵁uuid灏唋oginUser缂撳瓨 + //String userKey = getTokenKey(loginUser.getToken()); + //redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); String appUserType = loginUser.getUser().getAppUserType(); - if(StringUtils.isNull(appUserType)) - { + if (StringUtils.isNull(appUserType)) { loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); // 鏍规嵁uuid灏唋oginUser缂撳瓨 String userKey = getTokenKey(loginUser.getToken()); redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); - } - else - { - loginUser.setExpireTime(loginUser.getLoginTime() + 365*24*60 * MILLIS_MINUTE); + if (!soloLogin) { + // 缂撳瓨鐢ㄦ埛鍞竴鏍囪瘑锛岄槻姝㈠悓涓�甯愬彿锛屽悓鏃剁櫥褰� + String userIdKey = getUserIdKey(loginUser.getUser().getUserId()); + redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES); + } + } else { + loginUser.setExpireTime(loginUser.getLoginTime() + 365 * 24 * 60 * MILLIS_MINUTE); // 鏍规嵁uuid灏唋oginUser缂撳瓨 String userKey = getTokenKey(loginUser.getToken()); - redisCache.setCacheObject(userKey, loginUser, 365*24*60, TimeUnit.MINUTES); + redisCache.setCacheObject(userKey, loginUser, 365 * 24 * 60, TimeUnit.MINUTES); } - } /** @@ -165,8 +206,7 @@ * * @param loginUser 鐧诲綍淇℃伅 */ - public void setUserAgent(LoginUser loginUser) - { + public void setUserAgent(LoginUser loginUser) { UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); loginUser.setIpaddr(ip); @@ -181,8 +221,7 @@ * @param claims 鏁版嵁澹版槑 * @return 浠ょ墝 */ - private String createToken(Map<String, Object> claims) - { + private String createToken(Map<String, Object> claims) { String token = Jwts.builder() .setClaims(claims) .signWith(SignatureAlgorithm.HS512, secret).compact(); @@ -195,8 +234,7 @@ * @param token 浠ょ墝 * @return 鏁版嵁澹版槑 */ - private Claims parseToken(String token) - { + private Claims parseToken(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) @@ -209,8 +247,7 @@ * @param token 浠ょ墝 * @return 鐢ㄦ埛鍚� */ - public String getUsernameFromToken(String token) - { + public String getUsernameFromToken(String token) { Claims claims = parseToken(token); return claims.getSubject(); } @@ -221,18 +258,15 @@ * @param request * @return token */ - private String getToken(HttpServletRequest request) - { + private String getToken(HttpServletRequest request) { String token = request.getHeader(header); - if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) - { + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { token = token.replace(Constants.TOKEN_PREFIX, ""); } return token; } - private String getTokenKey(String uuid) - { + private String getTokenKey(String uuid) { return CacheConstants.LOGIN_TOKEN_KEY + uuid; } } -- Gitblit v1.9.3