hjl
2024-05-24 2a1e2ebb3ce800fc6aa8067db0cc3b0ab9253604
feat: 代码提交
5个文件已修改
558 ■■■■ 已修改文件
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 149 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java
@@ -1,17 +1,14 @@
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;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
 * spring redis 工具类
@@ -20,8 +17,7 @@
 **/
@SuppressWarnings(value = { "unchecked", "rawtypes" })
@Component
public class RedisService
{
public class RedisService {
    @Autowired
    public RedisTemplate redisTemplate;
@@ -31,8 +27,7 @@
     * @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);
    }
@@ -44,8 +39,7 @@
     * @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);
    }
@@ -56,8 +50,7 @@
     * @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);
    }
@@ -69,8 +62,7 @@
     * @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,8 +112,7 @@
     * @param collection 多个对象
     * @return
     */
    public boolean deleteObject(final Collection collection)
    {
    public boolean deleteObject(final Collection collection) {
        return redisTemplate.delete(collection) > 0;
    }
@@ -136,8 +123,7 @@
     * @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,8 +134,7 @@
     * @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);
    }
@@ -160,12 +145,10 @@
     * @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,8 +182,7 @@
     * @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);
    }
@@ -213,8 +193,7 @@
     * @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);
    }
@@ -225,8 +204,7 @@
     * @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);
    }
@@ -238,8 +216,7 @@
     * @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);
    }
@@ -250,8 +227,7 @@
     * @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);
    }
}
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,23 +52,21 @@
    /**
     * 会话注销,根据指定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();
    }
@@ -76,16 +75,13 @@
     * 
     * @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;
@@ -97,19 +93,29 @@
     * @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);
    }
    /**
     * 获取当前用户缓存信息, 如果未登录,则抛出异常
     * 学习端
     *
     * @param token 前端传递的认证信息
     * @return 用户缓存信息
     */
    public LoginUserParent getLoginUserStudy(String token) {
        return tokenService.getLoginUserStudy(token);
    }
    /**
@@ -117,18 +123,26 @@
     * 
     * @param loginUser 当前用户信息
     */
    public void verifyLoginUserExpire(LoginUser loginUser)
    {
    public void verifyLoginUserExpire(LoginUser loginUser) {
        tokenService.verifyToken(loginUser);
    }
    /**
     * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存
     *
     * @param loginUser 当前用户信息
     */
    public void verifyLoginUserExpire1(LoginUserParent loginUser)
    {
    public void verifyLoginUserExpire1(LoginUserParent loginUser) {
        tokenService.verifyToken1(loginUser);
    }
    /**
     * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存
     *
     * @param loginUser 当前用户信息
     */
    public void verifyLoginUserStudyExpire(LoginUserParent loginUser) {
        tokenService.verifyTokenStudy(loginUser);
    }
    /**
@@ -137,8 +151,7 @@
     * @param permission 权限字符串
     * @return 用户是否具备某权限
     */
    public boolean hasPermi(String permission)
    {
    public boolean hasPermi(String permission) {
        return hasPermi(getPermiList(), permission);
    }
@@ -148,10 +161,8 @@
     * @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);
        }
    }
@@ -161,15 +172,11 @@
     * 
     * @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);
            }
        }
@@ -196,18 +200,14 @@
     * 
     * @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);
        }
    }
@@ -218,8 +218,7 @@
     * @param role 角色标识
     * @return 用户是否具备某角色
     */
    public boolean hasRole(String role)
    {
    public boolean hasRole(String role) {
        return hasRole(getRoleList(), role);
    }
@@ -228,10 +227,8 @@
     * 
     * @param role 角色标识
     */
    public void checkRole(String role)
    {
        if (!hasRole(role))
        {
    public void checkRole(String role) {
        if (!hasRole(role)) {
            throw new NotRoleException(role);
        }
    }
@@ -241,14 +238,10 @@
     * 
     * @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());
        }
    }
@@ -258,13 +251,10 @@
     * 
     * @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);
            }
        }
@@ -275,18 +265,14 @@
     * 
     * @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);
        }
    }
@@ -296,8 +282,7 @@
     * 
     * @param at 注解对象
     */
    public void checkByAnnotation(RequiresLogin at)
    {
    public void checkByAnnotation(RequiresLogin at) {
        this.checkLogin();
    }
@@ -306,15 +291,11 @@
     * 
     * @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);
        }
    }
@@ -324,15 +305,11 @@
     * 
     * @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);
        }
    }
@@ -342,15 +319,11 @@
     * 
     * @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<>();
        }
    }
@@ -360,15 +333,11 @@
     * 
     * @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<>();
        }
    }
@@ -380,8 +349,7 @@
     * @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));
    }
@@ -393,8 +361,7 @@
     * @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));
    }
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java
@@ -10,8 +10,7 @@
 * 
 * @author ruoyi
 */
public class AuthUtil
{
public class AuthUtil {
    /**
     * 底层的 AuthLogic 对象
     */
@@ -20,8 +19,7 @@
    /**
     * 会话注销
     */
    public static void logout()
    {
    public static void logout() {
        authLogic.logout();
    }
@@ -30,25 +28,23 @@
     * 
     * @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();
    }
@@ -58,19 +54,28 @@
     * @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 token 指定token
     * @return 用户信息
     */
    public static LoginUserParent getLoginUserStudy(String token) {
        return authLogic.getLoginUserStudy(token);
    }
    /**
@@ -78,18 +83,26 @@
     * 
     * @param loginUser 用户信息
     */
    public static void verifyLoginUserExpire(LoginUser loginUser)
    {
    public static void verifyLoginUserExpire(LoginUser loginUser) {
        authLogic.verifyLoginUserExpire(loginUser);
    }
    /**
     * 验证当前用户有效期
     *
     * @param loginUser 用户信息
     */
    public static void verifyLoginUserExpire1(LoginUserParent loginUser)
    {
    public static void verifyLoginUserExpire1(LoginUserParent loginUser) {
        authLogic.verifyLoginUserExpire1(loginUser);
    }
    /**
     * 验证当前用户有效期 -学习端
     *
     * @param loginUser 用户信息
     */
    public static void verifyLoginUserStudyExpire(LoginUserParent loginUser) {
        authLogic.verifyLoginUserStudyExpire(loginUser);
    }
    /**
@@ -98,8 +111,7 @@
     * @param role 角色标识
     * @return 是否含有指定角色标识
     */
    public static boolean hasRole(String role)
    {
    public static boolean hasRole(String role) {
        return authLogic.hasRole(role);
    }
@@ -108,8 +120,7 @@
     * 
     * @param role 角色标识
     */
    public static void checkRole(String role)
    {
    public static void checkRole(String role) {
        authLogic.checkRole(role);
    }
@@ -118,8 +129,7 @@
     * 
     * @param requiresRoles 角色权限注解
     */
    public static void checkRole(RequiresRoles requiresRoles)
    {
    public static void checkRole(RequiresRoles requiresRoles) {
        authLogic.checkRole(requiresRoles);
    }
@@ -128,8 +138,7 @@
     * 
     * @param roles 角色标识数组
     */
    public static void checkRoleAnd(String... roles)
    {
    public static void checkRoleAnd(String... roles) {
        authLogic.checkRoleAnd(roles);
    }
@@ -138,8 +147,7 @@
     * 
     * @param roles 角色标识数组
     */
    public static void checkRoleOr(String... roles)
    {
    public static void checkRoleOr(String... roles) {
        authLogic.checkRoleOr(roles);
    }
@@ -149,8 +157,7 @@
     * @param permission 权限码
     * @return 是否含有指定权限
     */
    public static boolean hasPermi(String permission)
    {
    public static boolean hasPermi(String permission) {
        return authLogic.hasPermi(permission);
    }
@@ -159,8 +166,7 @@
     * 
     * @param permission 权限码
     */
    public static void checkPermi(String permission)
    {
    public static void checkPermi(String permission) {
        authLogic.checkPermi(permission);
    }
@@ -169,8 +175,7 @@
     * 
     * @param requiresPermissions 权限注解
     */
    public static void checkPermi(RequiresPermissions requiresPermissions)
    {
    public static void checkPermi(RequiresPermissions requiresPermissions) {
        authLogic.checkPermi(requiresPermissions);
    }
@@ -179,8 +184,7 @@
     * 
     * @param permissions 权限码数组
     */
    public static void checkPermiAnd(String... permissions)
    {
    public static void checkPermiAnd(String... permissions) {
        authLogic.checkPermiAnd(permissions);
    }
@@ -189,8 +193,7 @@
     * 
     * @param permissions 权限码数组
     */
    public static void checkPermiOr(String... permissions)
    {
    public static void checkPermiOr(String... permissions) {
        authLogic.checkPermiOr(permissions);
    }
}
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();
    }
}
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;
    }
}