陈昶聿
11 小时以前 2d3b575ed96eee7ccd5b324baa3135d2236934ac
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.service.IConfigService;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.AddressUtils;
@@ -13,6 +14,7 @@
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@@ -28,6 +30,7 @@
 *
 * @author ruoyi
 */
@Slf4j
@Component
public class TokenService {
    // 令牌自定义标识
@@ -51,6 +54,9 @@
    @Autowired
    private RedisCache redisCache;
    @Autowired
    private IConfigService configService;
    /**
     * 获取用户身份信息
     *
@@ -66,6 +72,8 @@
                String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
                String userKey = getTokenKey(uuid);
                LoginUser user = redisCache.getCacheObject(userKey);
                // 统一在会话解析层处理「全院区权限」,避免各业务接口直接读 user.campusid 时绕过配置。
                applyCampusAuthority(user);
                return user;
            } catch (Exception e) {
            }
@@ -74,6 +82,41 @@
    }
    /**
     * 应用全院区权限。
     * <p>
     * {@code sys.authority.campus.all} 配置的是用户名列表,命中后把当前会话的
     * campusid 置空;后续所有按 campusid 过滤的 SQL 都会因为参数为空而跳过院区条件。
     * <p>
     * 这里每次读取会话时都按当前配置重新判断,所以不需要重新登录;同时兼容配置值
     * 中带空格、换行、中文逗号/分号的情况。
     */
    private void applyCampusAuthority(LoginUser loginUser) {
        if (loginUser == null || loginUser.getUser() == null) {
            return;
        }
        try {
            String allCampus = configService.selectConfigByKey("sys.authority.campus.all");
            if (StringUtils.isEmpty(allCampus)) {
                return;
            }
            String userName = loginUser.getUser().getUserName();
            if (StringUtils.isEmpty(userName)) {
                return;
            }
            String[] users = allCampus.split("[,,;;\\s]+");
            for (String item : users) {
                if (userName.equals(item.trim())) {
                    loginUser.getUser().setCampusid(null);
                    return;
                }
            }
        } catch (Exception e) {
            // 配置服务异常不能导致 token 解析失败,否则会把用户直接踢下线。
            log.warn("【全院区权限】校验 sys.authority.campus.all 失败,userId={}", loginUser.getUserId(), e);
        }
    }
    /**
     * 设置用户身份信息
     */
    public void setLoginUser(LoginUser loginUser) {