From 5dacdee9b54c78372b68140e2b068d03a620eab9 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期三, 02 七月 2025 19:00:52 +0800
Subject: [PATCH] 修改bug

---
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java |  144 +++++++++++++++++++++++++++--------------------
 1 files changed, 82 insertions(+), 62 deletions(-)

diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java
index 04cc4b8..bb560ab 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java
@@ -15,73 +15,39 @@
  */
 package com.stylefeng.guns.core.beetl;
 
+import com.alibaba.fastjson.JSON;
 import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
 import com.stylefeng.guns.core.exception.GunsException;
 import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.modular.system.warpper.LoginUser;
+import org.apache.commons.codec.binary.Base64;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.subject.Subject;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
-import java.util.HashMap;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.io.UnsupportedEncodingException;
 import java.util.List;
-import java.util.Map;
 
+@Component
 public class ShiroExtUtil {
-    private static final String NAMES_DELIMETER = ",";
+    private final String NAMES_DELIMETER = ",";
     
-    public static Map<String, ShiroUser> map = new HashMap<>();
-
-    /**
-     * 获取当前 Subject
-     *
-     * @return Subject
-     */
-    protected static Subject getSubject() {
-        return SecurityUtils.getSubject();
-    }
-
-    /**
-     * 获取封装的 ShiroUser
-     *
-     * @return ShiroUser
-     */
-    public static ShiroUser getUser() {
-        String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
-        ShiroUser shiroUser = map.get(sessionId);
-        if(null == shiroUser){
-            throw new GunsException(BizExceptionEnum.TOKEN_ERROR);
-        }
-        return shiroUser;
-    }
-
-    /**
-     * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用
-     *
-     * @param roleName 角色名
-     * @return 属于该角色:true,否则false
-     */
-    public boolean hasRole(String roleName) {
-        return getSubject() != null && roleName != null
-                && roleName.length() > 0 && getSubject().hasRole(roleName);
-    }
-
-    /**
-     * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
-     *
-     * @param roleName 角色名
-     * @return 不属于该角色:true,否则false
-     */
-    public boolean lacksRole(String roleName) {
-        return !hasRole(roleName);
-    }
-
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+    
     /**
      * 验证当前用户是否属于以下任意一个角色。
      *
      * @param roleNames 角色列表
      * @return 属于:true,否则false
      */
-    public static boolean hasAnyRoles(String roleNames) {
+    public boolean hasAnyRoles(String roleNames) {
         boolean hasAnyRole = false;
         ShiroUser user = getUser();
         if (user != null && roleNames != null && roleNames.length() > 0) {
@@ -95,7 +61,62 @@
         }
         return hasAnyRole;
     }
-
+    
+    /**
+     * 获取封装的 ShiroUser
+     *
+     * @return ShiroUser
+     */
+    public ShiroUser getUser() {
+        ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (attrs != null) {
+            HttpServletRequest request = attrs.getRequest();
+            HttpSession session = request.getSession();
+            String onconParam = edu.yale.its.tp.cas.client.Util.getOnconParam(session);
+            try {
+                onconParam = new String(Base64.decodeBase64(onconParam), "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException(e);
+            }
+            LoginUser loginUser = JSON.parseObject(onconParam, LoginUser.class);
+            System.out.println("当前登录用户:" + JSON.toJSONString(loginUser));
+            String shiroUser = redisTemplate.opsForValue().get(loginUser.getOnconUUID());
+            System.out.println("当前登录用户缓存数据:" + shiroUser);
+            return JSON.parseObject(shiroUser, ShiroUser.class);
+        }
+        throw new GunsException(BizExceptionEnum.TOKEN_ERROR);
+    }
+    
+    /**
+     * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
+     *
+     * @param roleName 角色名
+     * @return 不属于该角色:true,否则false
+     */
+    public boolean lacksRole(String roleName) {
+        return !hasRole(roleName);
+    }
+    
+    /**
+     * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用
+     *
+     * @param roleName 角色名
+     * @return 属于该角色:true,否则false
+     */
+    public boolean hasRole(String roleName) {
+        return getSubject() != null && roleName != null
+                && roleName.length() > 0 && getSubject().hasRole(roleName);
+    }
+    
+    /**
+     * 获取当前 Subject
+     *
+     * @return Subject
+     */
+    protected Subject getSubject() {
+        return SecurityUtils.getSubject();
+    }
+    
     /**
      * 验证当前用户是否属于以下所有角色。
      *
@@ -115,24 +136,24 @@
         }
         return hasAllRole;
     }
-
+    
     /**
      * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用
      *
      * @param permission 权限名
      * @return 拥有权限:true,否则false
      */
-    public static boolean hasPermission(String permission) {
+    public boolean hasPermission(String permission) {
         ShiroUser user = getUser();
-        if(null == user){
+        if (null == user) {
             return false;
         }
-        if(user.isAdmin()){
+        if (user.isAdmin()) {
             return true;
         }
         return user.getMenuIds().contains(permission);
     }
-
+    
     /**
      * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。
      *
@@ -142,7 +163,7 @@
     public boolean lacksPermission(String permission) {
         return !hasPermission(permission);
     }
-
+    
     /**
      * 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用
      *
@@ -151,7 +172,7 @@
     public boolean authenticated() {
         return getSubject() != null && getSubject().isAuthenticated();
     }
-
+    
     /**
      * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。
      *
@@ -160,7 +181,7 @@
     public boolean notAuthenticated() {
         return !authenticated();
     }
-
+    
     /**
      * 认证通过或已记住的用户。与guset搭配使用。
      *
@@ -169,7 +190,7 @@
     public boolean isUser() {
         return getSubject() != null && getSubject().getPrincipal() != null;
     }
-
+    
     /**
      * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用
      *
@@ -178,7 +199,7 @@
     public boolean isGuest() {
         return !isUser();
     }
-
+    
     /**
      * 输出当前用户信息,通常为登录帐号信息。
      *
@@ -191,7 +212,6 @@
         }
         return "";
     }
-    
     
     
 }

--
Gitblit v1.7.1