From 2a1e2ebb3ce800fc6aa8067db0cc3b0ab9253604 Mon Sep 17 00:00:00 2001 From: hjl <1657978663@qq.com> Date: 星期五, 24 五月 2024 10:32:36 +0800 Subject: [PATCH] feat: 代码提交 --- ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java | 261 +++++++++------------ ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java | 149 ++++++------ ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java | 111 +++----- ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java | 40 +- ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java | 113 ++++---- 5 files changed, 310 insertions(+), 364 deletions(-) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java index 435cb6e..2b3e9a9 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java @@ -1,11 +1,5 @@ package com.ruoyi.common.redis.service; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; @@ -13,64 +7,62 @@ import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; +import java.util.*; +import java.util.concurrent.TimeUnit; + /** * spring redis 工具类 - * + * * @author ruoyi **/ -@SuppressWarnings(value = { "unchecked", "rawtypes" }) +@SuppressWarnings(value = {"unchecked", "rawtypes"}) @Component -public class RedisService -{ +public class RedisService { @Autowired public RedisTemplate redisTemplate; /** * 缓存基本的对象,Integer、String、实体类等 * - * @param key 缓存的键值 + * @param key 缓存的键值 * @param value 缓存的值 */ - public <T> void setCacheObject(final String key, final T value) - { + public <T> void setCacheObject(final String key, final T value) { redisTemplate.opsForValue().set(key, value); } /** * 缓存基本的对象,Integer、String、实体类等 * - * @param key 缓存的键值 - * @param value 缓存的值 - * @param timeout 时间 + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 * @param timeUnit 时间颗粒度 */ - public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit) - { + public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit) { redisTemplate.opsForValue().set(key, value, timeout, timeUnit); } /** * 设置有效时间 * - * @param key Redis键 + * @param key Redis键 * @param timeout 超时时间 * @return true=设置成功;false=设置失败 */ - public boolean expire(final String key, final long timeout) - { + public boolean expire(final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); } /** * 设置有效时间 * - * @param key Redis键 + * @param key Redis键 * @param timeout 超时时间 - * @param unit 时间单位 + * @param unit 时间单位 * @return true=设置成功;false=设置失败 */ - public boolean expire(final String key, final long timeout, final TimeUnit unit) - { + public boolean expire(final String key, final long timeout, final TimeUnit unit) { return redisTemplate.expire(key, timeout, unit); } @@ -80,8 +72,7 @@ * @param key Redis键 * @return 有效时间 */ - public long getExpire(final String key) - { + public long getExpire(final String key) { return redisTemplate.getExpire(key); } @@ -91,8 +82,7 @@ * @param key 键 * @return true 存在 false不存在 */ - public Boolean hasKey(String key) - { + public Boolean hasKey(String key) { return redisTemplate.hasKey(key); } @@ -102,8 +92,7 @@ * @param key 缓存键值 * @return 缓存键值对应的数据 */ - public <T> T getCacheObject(final String key) - { + public <T> T getCacheObject(final String key) { ValueOperations<String, T> operation = redisTemplate.opsForValue(); return operation.get(key); } @@ -113,8 +102,7 @@ * * @param key */ - public boolean deleteObject(final String key) - { + public boolean deleteObject(final String key) { return redisTemplate.delete(key); } @@ -124,20 +112,18 @@ * @param collection 多个对象 * @return */ - public boolean deleteObject(final Collection collection) - { + public boolean deleteObject(final Collection collection) { return redisTemplate.delete(collection) > 0; } /** * 缓存List数据 * - * @param key 缓存的键值 + * @param key 缓存的键值 * @param dataList 待缓存的List数据 * @return 缓存的对象 */ - public <T> long setCacheList(final String key, final List<T> dataList) - { + public <T> long setCacheList(final String key, final List<T> dataList) { Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count == null ? 0 : count; } @@ -148,24 +134,21 @@ * @param key 缓存的键值 * @return 缓存键值对应的数据 */ - public <T> List<T> getCacheList(final String key) - { + public <T> List<T> getCacheList(final String key) { return redisTemplate.opsForList().range(key, 0, -1); } /** * 缓存Set * - * @param key 缓存键值 + * @param key 缓存键值 * @param dataSet 缓存的数据 * @return 缓存数据的对象 */ - public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) - { + public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) { BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key); Iterator<T> it = dataSet.iterator(); - while (it.hasNext()) - { + while (it.hasNext()) { setOperation.add(it.next()); } return setOperation; @@ -177,8 +160,7 @@ * @param key * @return */ - public <T> Set<T> getCacheSet(final String key) - { + public <T> Set<T> getCacheSet(final String key) { return redisTemplate.opsForSet().members(key); } @@ -188,8 +170,7 @@ * @param key * @param dataMap */ - public <T> void setCacheMap(final String key, final Map<String, T> dataMap) - { + public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { if (dataMap != null) { redisTemplate.opsForHash().putAll(key, dataMap); } @@ -201,32 +182,29 @@ * @param key * @return */ - public <T> Map<String, T> getCacheMap(final String key) - { + public <T> Map<String, T> getCacheMap(final String key) { return redisTemplate.opsForHash().entries(key); } /** * 往Hash中存入数据 * - * @param key Redis键 - * @param hKey Hash键 + * @param key Redis键 + * @param hKey Hash键 * @param value 值 */ - public <T> void setCacheMapValue(final String key, final String hKey, final T value) - { + public <T> void setCacheMapValue(final String key, final String hKey, final T value) { redisTemplate.opsForHash().put(key, hKey, value); } /** * 获取Hash中的数据 * - * @param key Redis键 + * @param key Redis键 * @param hKey Hash键 * @return Hash中的对象 */ - public <T> T getCacheMapValue(final String key, final String hKey) - { + public <T> T getCacheMapValue(final String key, final String hKey) { HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash(); return opsForHash.get(key, hKey); } @@ -234,24 +212,22 @@ /** * 获取多个Hash中的数据 * - * @param key Redis键 + * @param key Redis键 * @param hKeys Hash键集合 * @return Hash对象集合 */ - public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) - { + public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } /** * 删除Hash中的某条数据 * - * @param key Redis键 + * @param key Redis键 * @param hKey Hash键 * @return 是否成功 */ - public boolean deleteCacheMapValue(final String key, final String hKey) - { + public boolean deleteCacheMapValue(final String key, final String hKey) { return redisTemplate.opsForHash().delete(key, hKey) > 0; } @@ -261,8 +237,11 @@ * @param pattern 字符串前缀 * @return 对象列表 */ - public Collection<String> keys(final String pattern) - { + public Collection<String> keys(final String pattern) { return redisTemplate.keys(pattern); } + + public Set getKeysPrefix(String accessToken) { + return redisTemplate.keys(accessToken); + } } diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java index 403347e..542b9ef 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java @@ -1,11 +1,5 @@ package com.ruoyi.common.security.auth; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import com.ruoyi.system.api.model.LoginUserParent; -import org.springframework.util.PatternMatchUtils; import com.ruoyi.common.core.context.SecurityContextHolder; import com.ruoyi.common.core.exception.auth.NotLoginException; import com.ruoyi.common.core.exception.auth.NotPermissionException; @@ -19,18 +13,27 @@ import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.model.LoginUser; +import com.ruoyi.system.api.model.LoginUserParent; +import org.springframework.util.PatternMatchUtils; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; /** * Token 权限验证,逻辑实现类 - * + * * @author ruoyi */ -public class AuthLogic -{ - /** 所有权限标识 */ +public class AuthLogic { + /** + * 所有权限标识 + */ private static final String ALL_PERMISSION = "*:*:*"; - /** 管理员角色权限标识 */ + /** + * 管理员角色权限标识 + */ private static final String SUPER_ADMIN = "admin"; public TokenService tokenService = SpringUtils.getBean(TokenService.class); @@ -38,11 +41,9 @@ /** * 会话注销 */ - public void logout() - { + public void logout() { String token = SecurityUtils.getToken(); - if (token == null) - { + if (token == null) { return; } logoutByToken(token); @@ -51,41 +52,36 @@ /** * 会话注销,根据指定Token */ - public void logoutByToken(String token) - { + public void logoutByToken(String token) { tokenService.delLoginUser(token); } + /** * 家长端会话注销,根据指定Token */ - public void logoutByToken1(String token) - { + public void logoutByToken1(String token) { tokenService.delLoginUser1(token); } /** * 检验用户是否已经登录,如未登录,则抛出异常 */ - public void checkLogin() - { + public void checkLogin() { getLoginUser(); } /** * 获取当前用户缓存信息, 如果未登录,则抛出异常 - * + * * @return 用户缓存信息 */ - public LoginUser getLoginUser() - { + public LoginUser getLoginUser() { String token = SecurityUtils.getToken(); - if (token == null) - { + if (token == null) { throw new NotLoginException("未提供token"); } LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser == null) - { + if (loginUser == null) { throw new NotLoginException("无效的token"); } return loginUser; @@ -93,83 +89,94 @@ /** * 获取当前用户缓存信息, 如果未登录,则抛出异常 - * + * * @param token 前端传递的认证信息 * @return 用户缓存信息 */ - public LoginUser getLoginUser(String token) - { + public LoginUser getLoginUser(String token) { return tokenService.getLoginUser(token); } + /** * 获取当前用户缓存信息, 如果未登录,则抛出异常 * * @param token 前端传递的认证信息 * @return 用户缓存信息 */ - public LoginUserParent getLoginUser1(String token) - { + public LoginUserParent getLoginUser1(String token) { return tokenService.getLoginUser1(token); } /** - * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存 - * - * @param loginUser 当前用户信息 + * 获取当前用户缓存信息, 如果未登录,则抛出异常 + * 学习端 + * + * @param token 前端传递的认证信息 + * @return 用户缓存信息 */ - public void verifyLoginUserExpire(LoginUser loginUser) - { - tokenService.verifyToken(loginUser); + public LoginUserParent getLoginUserStudy(String token) { + return tokenService.getLoginUserStudy(token); } + /** * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存 * * @param loginUser 当前用户信息 */ - public void verifyLoginUserExpire1(LoginUserParent loginUser) - { + public void verifyLoginUserExpire(LoginUser loginUser) { + tokenService.verifyToken(loginUser); + } + + /** + * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存 + * + * @param loginUser 当前用户信息 + */ + public void verifyLoginUserExpire1(LoginUserParent loginUser) { tokenService.verifyToken1(loginUser); } /** + * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存 + * + * @param loginUser 当前用户信息 + */ + public void verifyLoginUserStudyExpire(LoginUserParent loginUser) { + tokenService.verifyTokenStudy(loginUser); + } + + /** * 验证用户是否具备某权限 - * + * * @param permission 权限字符串 * @return 用户是否具备某权限 */ - public boolean hasPermi(String permission) - { + public boolean hasPermi(String permission) { return hasPermi(getPermiList(), permission); } /** * 验证用户是否具备某权限, 如果验证未通过,则抛出异常: NotPermissionException - * + * * @param permission 权限字符串 * @return 用户是否具备某权限 */ - public void checkPermi(String permission) - { - if (!hasPermi(getPermiList(), permission)) - { + public void checkPermi(String permission) { + if (!hasPermi(getPermiList(), permission)) { throw new NotPermissionException(permission); } } /** * 根据注解(@RequiresPermissions)鉴权, 如果验证未通过,则抛出异常: NotPermissionException - * + * * @param requiresPermissions 注解对象 */ - public void checkPermi(RequiresPermissions requiresPermissions) - { + public void checkPermi(RequiresPermissions requiresPermissions) { SecurityContextHolder.setPermission(StringUtils.join(requiresPermissions.value(), ",")); - if (requiresPermissions.logical() == Logical.AND) - { + if (requiresPermissions.logical() == Logical.AND) { checkPermiAnd(requiresPermissions.value()); - } - else - { + } else { checkPermiOr(requiresPermissions.value()); } } @@ -179,13 +186,10 @@ * * @param permissions 权限列表 */ - public void checkPermiAnd(String... permissions) - { + public void checkPermiAnd(String... permissions) { Set<String> permissionList = getPermiList(); - for (String permission : permissions) - { - if (!hasPermi(permissionList, permission)) - { + for (String permission : permissions) { + if (!hasPermi(permissionList, permission)) { throw new NotPermissionException(permission); } } @@ -193,78 +197,64 @@ /** * 验证用户是否含有指定权限,只需包含其中一个 - * + * * @param permissions 权限码数组 */ - public void checkPermiOr(String... permissions) - { + public void checkPermiOr(String... permissions) { Set<String> permissionList = getPermiList(); - for (String permission : permissions) - { - if (hasPermi(permissionList, permission)) - { + for (String permission : permissions) { + if (hasPermi(permissionList, permission)) { return; } } - if (permissions.length > 0) - { + if (permissions.length > 0) { throw new NotPermissionException(permissions); } } /** * 判断用户是否拥有某个角色 - * + * * @param role 角色标识 * @return 用户是否具备某角色 */ - public boolean hasRole(String role) - { + public boolean hasRole(String role) { return hasRole(getRoleList(), role); } /** * 判断用户是否拥有某个角色, 如果验证未通过,则抛出异常: NotRoleException - * + * * @param role 角色标识 */ - public void checkRole(String role) - { - if (!hasRole(role)) - { + public void checkRole(String role) { + if (!hasRole(role)) { throw new NotRoleException(role); } } /** * 根据注解(@RequiresRoles)鉴权 - * + * * @param requiresRoles 注解对象 */ - public void checkRole(RequiresRoles requiresRoles) - { - if (requiresRoles.logical() == Logical.AND) - { + public void checkRole(RequiresRoles requiresRoles) { + if (requiresRoles.logical() == Logical.AND) { checkRoleAnd(requiresRoles.value()); - } - else - { + } else { checkRoleOr(requiresRoles.value()); } } /** * 验证用户是否含有指定角色,必须全部拥有 - * + * * @param roles 角色标识数组 */ - public void checkRoleAnd(String... roles) - { + public void checkRoleAnd(String... roles) { Set<String> roleList = getRoleList(); - for (String role : roles) - { - if (!hasRole(roleList, role)) - { + for (String role : roles) { + if (!hasRole(roleList, role)) { throw new NotRoleException(role); } } @@ -272,129 +262,106 @@ /** * 验证用户是否含有指定角色,只需包含其中一个 - * + * * @param roles 角色标识数组 */ - public void checkRoleOr(String... roles) - { + public void checkRoleOr(String... roles) { Set<String> roleList = getRoleList(); - for (String role : roles) - { - if (hasRole(roleList, role)) - { + for (String role : roles) { + if (hasRole(roleList, role)) { return; } } - if (roles.length > 0) - { + if (roles.length > 0) { throw new NotRoleException(roles); } } /** * 根据注解(@RequiresLogin)鉴权 - * + * * @param at 注解对象 */ - public void checkByAnnotation(RequiresLogin at) - { + public void checkByAnnotation(RequiresLogin at) { this.checkLogin(); } /** * 根据注解(@RequiresRoles)鉴权 - * + * * @param at 注解对象 */ - public void checkByAnnotation(RequiresRoles at) - { + public void checkByAnnotation(RequiresRoles at) { String[] roleArray = at.value(); - if (at.logical() == Logical.AND) - { + if (at.logical() == Logical.AND) { this.checkRoleAnd(roleArray); - } - else - { + } else { this.checkRoleOr(roleArray); } } /** * 根据注解(@RequiresPermissions)鉴权 - * + * * @param at 注解对象 */ - public void checkByAnnotation(RequiresPermissions at) - { + public void checkByAnnotation(RequiresPermissions at) { String[] permissionArray = at.value(); - if (at.logical() == Logical.AND) - { + if (at.logical() == Logical.AND) { this.checkPermiAnd(permissionArray); - } - else - { + } else { this.checkPermiOr(permissionArray); } } /** * 获取当前账号的角色列表 - * + * * @return 角色列表 */ - public Set<String> getRoleList() - { - try - { + public Set<String> getRoleList() { + try { LoginUser loginUser = getLoginUser(); return loginUser.getRoles(); - } - catch (Exception e) - { + } catch (Exception e) { return new HashSet<>(); } } /** * 获取当前账号的权限列表 - * + * * @return 权限列表 */ - public Set<String> getPermiList() - { - try - { + public Set<String> getPermiList() { + try { LoginUser loginUser = getLoginUser(); return loginUser.getPermissions(); - } - catch (Exception e) - { + } catch (Exception e) { return new HashSet<>(); } } /** * 判断是否包含权限 - * + * * @param authorities 权限列表 - * @param permission 权限字符串 + * @param permission 权限字符串 * @return 用户是否具备某权限 */ - public boolean hasPermi(Collection<String> authorities, String permission) - { + public boolean hasPermi(Collection<String> authorities, String permission) { return authorities.stream().filter(StringUtils::hasText) .anyMatch(x -> ALL_PERMISSION.contains(x) || PatternMatchUtils.simpleMatch(x, permission)); } /** * 判断是否包含角色 - * + * * @param roles 角色列表 - * @param role 角色 + * @param role 角色 * @return 用户是否具备某角色权限 */ - public boolean hasRole(Collection<String> roles, String role) - { + public boolean hasRole(Collection<String> roles, String role) { return roles.stream().filter(StringUtils::hasText) .anyMatch(x -> SUPER_ADMIN.contains(x) || PatternMatchUtils.simpleMatch(x, role)); } diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java index 34d153e..47f0533 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java @@ -7,11 +7,10 @@ /** * Token 权限验证工具类 - * + * * @author ruoyi */ -public class AuthUtil -{ +public class AuthUtil { /** * 底层的 AuthLogic 对象 */ @@ -20,177 +19,181 @@ /** * 会话注销 */ - public static void logout() - { + public static void logout() { authLogic.logout(); } /** * 会话注销,根据指定Token - * + * * @param token 指定token */ - public static void logoutByToken(String token) - { + public static void logoutByToken(String token) { authLogic.logoutByToken(token); } + /** * 家长端会话注销,根据指定Token * * @param token 指定token */ - public static void logoutByToken1(String token) - { + public static void logoutByToken1(String token) { authLogic.logoutByToken1(token); } /** * 检验当前会话是否已经登录,如未登录,则抛出异常 */ - public static void checkLogin() - { + public static void checkLogin() { authLogic.checkLogin(); } /** * 获取当前登录用户信息 - * + * * @param token 指定token * @return 用户信息 */ - public static LoginUser getLoginUser(String token) - { + public static LoginUser getLoginUser(String token) { return authLogic.getLoginUser(token); } + /** * 获取当前登录用户信息 * * @param token 指定token * @return 用户信息 */ - public static LoginUserParent getLoginUser1(String token) - { + public static LoginUserParent getLoginUser1(String token) { return authLogic.getLoginUser1(token); } /** - * 验证当前用户有效期 - * - * @param loginUser 用户信息 + * 获取当前登录用户信息-学习端 + * + * @param token 指定token + * @return 用户信息 */ - public static void verifyLoginUserExpire(LoginUser loginUser) - { - authLogic.verifyLoginUserExpire(loginUser); + public static LoginUserParent getLoginUserStudy(String token) { + return authLogic.getLoginUserStudy(token); } + /** * 验证当前用户有效期 * * @param loginUser 用户信息 */ - public static void verifyLoginUserExpire1(LoginUserParent loginUser) - { + public static void verifyLoginUserExpire(LoginUser loginUser) { + authLogic.verifyLoginUserExpire(loginUser); + } + + /** + * 验证当前用户有效期 + * + * @param loginUser 用户信息 + */ + public static void verifyLoginUserExpire1(LoginUserParent loginUser) { authLogic.verifyLoginUserExpire1(loginUser); } /** + * 验证当前用户有效期 -学习端 + * + * @param loginUser 用户信息 + */ + public static void verifyLoginUserStudyExpire(LoginUserParent loginUser) { + authLogic.verifyLoginUserStudyExpire(loginUser); + } + + /** * 当前账号是否含有指定角色标识, 返回true或false - * + * * @param role 角色标识 * @return 是否含有指定角色标识 */ - public static boolean hasRole(String role) - { + public static boolean hasRole(String role) { return authLogic.hasRole(role); } /** * 当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException - * + * * @param role 角色标识 */ - public static void checkRole(String role) - { + public static void checkRole(String role) { authLogic.checkRole(role); } /** * 根据注解传入参数鉴权, 如果验证未通过,则抛出异常: NotRoleException - * + * * @param requiresRoles 角色权限注解 */ - public static void checkRole(RequiresRoles requiresRoles) - { + public static void checkRole(RequiresRoles requiresRoles) { authLogic.checkRole(requiresRoles); } /** * 当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] - * + * * @param roles 角色标识数组 */ - public static void checkRoleAnd(String... roles) - { + public static void checkRoleAnd(String... roles) { authLogic.checkRoleAnd(roles); } /** * 当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] - * + * * @param roles 角色标识数组 */ - public static void checkRoleOr(String... roles) - { + public static void checkRoleOr(String... roles) { authLogic.checkRoleOr(roles); } /** * 当前账号是否含有指定权限, 返回true或false - * + * * @param permission 权限码 * @return 是否含有指定权限 */ - public static boolean hasPermi(String permission) - { + public static boolean hasPermi(String permission) { return authLogic.hasPermi(permission); } /** * 当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException - * + * * @param permission 权限码 */ - public static void checkPermi(String permission) - { + public static void checkPermi(String permission) { authLogic.checkPermi(permission); } /** * 根据注解传入参数鉴权, 如果验证未通过,则抛出异常: NotPermissionException - * + * * @param requiresPermissions 权限注解 */ - public static void checkPermi(RequiresPermissions requiresPermissions) - { + public static void checkPermi(RequiresPermissions requiresPermissions) { authLogic.checkPermi(requiresPermissions); } /** * 当前账号是否含有指定权限 [指定多个,必须全部验证通过] - * + * * @param permissions 权限码数组 */ - public static void checkPermiAnd(String... permissions) - { + public static void checkPermiAnd(String... permissions) { authLogic.checkPermiAnd(permissions); } /** * 当前账号是否含有指定权限 [指定多个,只要其一验证通过即可] - * + * * @param permissions 权限码数组 */ - public static void checkPermiOr(String... permissions) - { + public static void checkPermiOr(String... permissions) { authLogic.checkPermiOr(permissions); } } diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java index b8ac863..b4d032b 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java @@ -1,11 +1,5 @@ package com.ruoyi.common.security.interceptor; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.ruoyi.system.api.model.LoginUserParent; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.AsyncHandlerInterceptor; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.context.SecurityContextHolder; import com.ruoyi.common.core.utils.ServletUtils; @@ -13,6 +7,12 @@ import com.ruoyi.common.security.auth.AuthUtil; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.model.LoginUser; +import com.ruoyi.system.api.model.LoginUserParent; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.AsyncHandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * 自定义请求头拦截器,将Header数据封装到线程变量中方便获取 @@ -20,13 +20,10 @@ * * @author ruoyi */ -public class HeaderInterceptor implements AsyncHandlerInterceptor -{ +public class HeaderInterceptor implements AsyncHandlerInterceptor { @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception - { - if (!(handler instanceof HandlerMethod)) - { + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (!(handler instanceof HandlerMethod)) { return true; } @@ -35,28 +32,31 @@ SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY)); String token = SecurityUtils.getToken(); - if (StringUtils.isNotEmpty(token)) - { + if (StringUtils.isNotEmpty(token)) { LoginUser loginUser = AuthUtil.getLoginUser(token); - if (StringUtils.isNotNull(loginUser)) - { + if (StringUtils.isNotNull(loginUser)) { AuthUtil.verifyLoginUserExpire(loginUser); SecurityContextHolder.set(SecurityConstants.LOGIN_USER, loginUser); } LoginUserParent loginUser1 = AuthUtil.getLoginUser1(token); - if (StringUtils.isNotNull(loginUser1)) - { + if (StringUtils.isNotNull(loginUser1)) { AuthUtil.verifyLoginUserExpire1(loginUser1); SecurityContextHolder.set(SecurityConstants.LOGIN_USER, loginUser); } +// LoginUserParent loginUserStudy = AuthUtil.getLoginUserStudy(token); +// if (StringUtils.isNotNull(loginUserStudy)) { +// AuthUtil.verifyLoginUserStudyExpire(loginUserStudy); +// SecurityContextHolder.set(SecurityConstants.USER_STUDY_KEY, loginUserStudy); +// } else { +// return false; +// } } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) - throws Exception - { + throws Exception { SecurityContextHolder.remove(); } } diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java index d114fd9..38eed13 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java @@ -1,7 +1,9 @@ package com.ruoyi.common.security.service; +import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.exception.GlobalException; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.ServletUtils; import com.ruoyi.common.core.utils.StringUtils; @@ -17,6 +19,7 @@ import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -25,8 +28,7 @@ * @author ruoyi */ @Component -public class TokenService -{ +public class TokenService { @Autowired private RedisService redisService; @@ -43,8 +45,7 @@ /** * 创建令牌 */ - public Map<String, Object> createToken(LoginUser loginUser) - { + public Map<String, Object> createToken(LoginUser loginUser) { String token = IdUtils.fastUUID(); Long userId = loginUser.getSysUser().getUserId(); String userName = loginUser.getSysUser().getUserName(); @@ -66,8 +67,8 @@ rspMap.put("expires_in", expireTime); return rspMap; } - public Map<String, Object> createToken1(LoginUserParent loginUser) - { + + public Map<String, Object> createToken1(LoginUserParent loginUser) { String token = IdUtils.fastUUID(); Integer userId = loginUser.getUserid(); String name = loginUser.getName(); @@ -86,8 +87,7 @@ return rspMap; } - public Map<String, Object> createTokenStudy(LoginUserParent loginUser) - { + public Map<String, Object> createTokenStudy(LoginUserParent loginUser) { String token = IdUtils.fastUUID(); Integer userId = loginUser.getUserid(); String name = loginUser.getName(); @@ -111,8 +111,7 @@ * * @return 用户信息 */ - public LoginUser getLoginUser() - { + public LoginUser getLoginUser() { return getLoginUser(ServletUtils.getRequest()); } @@ -121,19 +120,18 @@ * * @return 用户信息 */ - public LoginUser getLoginUser(HttpServletRequest request) - { + public LoginUser getLoginUser(HttpServletRequest request) { // 获取请求携带的令牌 String token = SecurityUtils.getToken(request); return getLoginUser(token); } + /** * 家长端/学习端获取用户身份信息 * * @return 用户信息 */ - public LoginUserParent getLoginUser1() - { + public LoginUserParent getLoginUser1() { return getLoginUser1(ServletUtils.getRequest()); } @@ -142,9 +140,12 @@ * * @return 用户信息 */ - public LoginUserParent getLoginUserStudy() - { - return getLoginUserStudy(ServletUtils.getRequest()); + public LoginUserParent getLoginUserStudy() { + LoginUserParent userStudy = getLoginUserStudy(ServletUtils.getRequest()); + if (null == userStudy) { + throw new GlobalException("登录失效,请重新登录!"); + } + return userStudy; } /** @@ -152,8 +153,7 @@ * * @return 用户信息 */ - public LoginUserParent getLoginUser1(HttpServletRequest request) - { + public LoginUserParent getLoginUser1(HttpServletRequest request) { // 获取请求携带的令牌 String token = SecurityUtils.getToken(request); return getLoginUser1(token); @@ -164,8 +164,7 @@ * * @return 用户信息 */ - public LoginUserParent getLoginUserStudy(HttpServletRequest request) - { + public LoginUserParent getLoginUserStudy(HttpServletRequest request) { // 获取请求携带的令牌 String token = SecurityUtils.getToken(request); return getLoginUserStudy(token); @@ -176,42 +175,33 @@ * * @return 用户信息 */ - public LoginUser getLoginUser(String token) - { + public LoginUser getLoginUser(String token) { LoginUser user = null; - try - { - if (StringUtils.isNotEmpty(token)) - { + try { + if (StringUtils.isNotEmpty(token)) { String userkey = JwtUtils.getUserKey(token); user = redisService.getCacheObject(getTokenKey(userkey)); return user; } - } - catch (Exception e) - { + } catch (Exception e) { } return user; } + /** * 家长端 学习端 获取用户身份信息 * * @return 用户信息 */ - public LoginUserParent getLoginUser1(String token) - { + public LoginUserParent getLoginUser1(String token) { LoginUserParent user = null; - try - { - if (StringUtils.isNotEmpty(token)) - { + try { + if (StringUtils.isNotEmpty(token)) { String userkey = JwtUtils.getUserKey1(token); user = redisService.getCacheObject(getTokenKey(userkey)); return user; } - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } return user; @@ -222,20 +212,15 @@ * * @return 用户信息 */ - public LoginUserParent getLoginUserStudy(String token) - { + public LoginUserParent getLoginUserStudy(String token) { LoginUserParent user = null; - try - { - if (StringUtils.isNotEmpty(token)) - { + try { + if (StringUtils.isNotEmpty(token)) { String userkey = JwtUtils.getUserKeyStudy(token); user = redisService.getCacheObject(getTokenKey(userkey)); return user; } - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } return user; @@ -244,10 +229,8 @@ /** * 设置用户身份信息 */ - 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); } } @@ -255,21 +238,18 @@ /** * 删除用户缓存信息 */ - public void delLoginUser(String token) - { - if (StringUtils.isNotEmpty(token)) - { + public void delLoginUser(String token) { + if (StringUtils.isNotEmpty(token)) { String userkey = JwtUtils.getUserKey(token); redisService.deleteObject(getTokenKey(userkey)); } } + /** * 家长端删除用户缓存信息 */ - public void delLoginUser1(String token) - { - if (StringUtils.isNotEmpty(token)) - { + public void delLoginUser1(String token) { + if (StringUtils.isNotEmpty(token)) { String userkey = JwtUtils.getUserKey1(token); redisService.deleteObject(getTokenKey(userkey)); } @@ -280,27 +260,35 @@ * * @param loginUser */ - 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); } } + /** * 验证令牌有效期,相差不足120分钟,自动刷新缓存 * * @param loginUser */ - public void verifyToken1(LoginUserParent loginUser) - { + public void verifyToken1(LoginUserParent loginUser) { long expireTime = loginUser.getExpireTime(); long currentTime = System.currentTimeMillis(); - if (expireTime - currentTime <= MILLIS_MINUTE_TEN) - { + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { refreshToken1(loginUser); + } + } + + /** + * 验证令牌有效期,相差不足120分钟,自动刷新缓存 + */ + public void verifyTokenStudy(LoginUserParent loginUser) { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { + refreshTokenStudy(loginUser); } } @@ -309,8 +297,7 @@ * * @param loginUser 登录信息 */ - public void refreshToken(LoginUser loginUser) - { + public void refreshToken(LoginUser loginUser) { loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); // 根据uuid将loginUser缓存 @@ -321,8 +308,7 @@ /** * 家长端用户登录 */ - public void refreshToken1(LoginUserParent dto) - { + public void refreshToken1(LoginUserParent dto) { dto.setLoginTime(System.currentTimeMillis()); dto.setExpireTime(dto.getLoginTime() + expireTime * MILLIS_MINUTE); // 根据uuid将loginUser缓存 @@ -333,8 +319,20 @@ /** * 学习端用户登录 */ - public void refreshTokenStudy(LoginUserParent dto) - { + public void refreshTokenStudy(LoginUserParent dto) { + // 获取所有 login_tokens: 前缀的登录缓存 + Set redisCache = redisService.getKeysPrefix(ACCESS_TOKEN + "*"); + for (Object key : redisCache) { + String strKey = String.valueOf(key); + // 根据 login_tokens:加密token 获取用户登录信息 + Object redisCacheUserInfo = redisService.getCacheObject(strKey); + LoginUserParent redisUserInfo = JSONObject.parseObject(JSONObject.toJSONString(redisCacheUserInfo), LoginUserParent.class); + // 单点逻辑 + if (dto.getPhone().equals(redisUserInfo.getPhone())) { + redisService.deleteObject(strKey); + } + } + // 单点登录逻辑 dto.setLoginTime(System.currentTimeMillis()); dto.setExpireTime(dto.getLoginTime() + expireTime * MILLIS_MINUTE); // 根据uuid将loginUser缓存 @@ -342,8 +340,7 @@ redisService.setCacheObject(userKey, dto, expireTime, TimeUnit.MINUTES); } - private String getTokenKey(String token) - { + private String getTokenKey(String token) { return ACCESS_TOKEN + token; } } \ No newline at end of file -- Gitblit v1.7.1