Переглянути джерело

fix 修复 解决通过loginId查询角色和菜单权限 而非当前用户时 报错问题 支持跨服务查询权限信息通过satoken的api

疯狂的狮子Li 1 рік тому
батько
коміт
f15e8f1ffa

+ 28 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemotePermissionService.java

@@ -0,0 +1,28 @@
+package org.dromara.system.api;
+
+import java.util.Set;
+
+/**
+ * 用户权限处理
+ *
+ * @author Lion Li
+ */
+public interface RemotePermissionService {
+
+    /**
+     * 获取角色数据权限
+     *
+     * @param userId  用户id
+     * @return 角色权限信息
+     */
+    Set<String> getRolePermission(Long userId);
+
+    /**
+     * 获取菜单数据权限
+     *
+     * @param userId  用户id
+     * @return 菜单权限信息
+     */
+    Set<String> getMenuPermission(Long userId);
+
+}

+ 28 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java

@@ -0,0 +1,28 @@
+package org.dromara.common.core.service;
+
+import java.util.Set;
+
+/**
+ * 用户权限处理
+ *
+ * @author Lion Li
+ */
+public interface PermissionService {
+
+    /**
+     * 获取角色数据权限
+     *
+     * @param userId  用户id
+     * @return 角色权限信息
+     */
+    Set<String> getRolePermission(Long userId);
+
+    /**
+     * 获取菜单数据权限
+     *
+     * @param userId  用户id
+     * @return 菜单权限信息
+     */
+    Set<String> getMenuPermission(Long userId);
+
+}

+ 21 - 8
ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java

@@ -1,9 +1,13 @@
 package org.dromara.common.satoken.core.service;
 
 import cn.dev33.satoken.stp.StpInterface;
+import cn.hutool.core.util.ObjectUtil;
 import org.dromara.common.core.enums.UserType;
+import org.dromara.common.core.service.PermissionService;
+import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.api.model.LoginUser;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -15,19 +19,25 @@ import java.util.List;
  */
 public class SaPermissionImpl implements StpInterface {
 
+    @Autowired
+    private PermissionService permissionService;
+
     /**
      * 获取菜单权限列表
      */
     @Override
     public List<String> getPermissionList(Object loginId, String loginType) {
         LoginUser loginUser = LoginHelper.getLoginUser();
+        if (ObjectUtil.isNull(loginUser)) {
+            List<String> list = StringUtils.splitList(loginId.toString(), ":");
+            return new ArrayList<>(permissionService.getMenuPermission(Long.parseLong(list.get(1))));
+        }
         UserType userType = UserType.getUserType(loginUser.getUserType());
-        if (userType == UserType.SYS_USER) {
-            return new ArrayList<>(loginUser.getMenuPermission());
-        } else if (userType == UserType.APP_USER) {
+        if (userType == UserType.APP_USER) {
             // 其他端 自行根据业务编写
         }
-        return new ArrayList<>();
+        // SYS_USER 默认返回权限
+        return new ArrayList<>(loginUser.getMenuPermission());
     }
 
     /**
@@ -36,12 +46,15 @@ public class SaPermissionImpl implements StpInterface {
     @Override
     public List<String> getRoleList(Object loginId, String loginType) {
         LoginUser loginUser = LoginHelper.getLoginUser();
+        if (ObjectUtil.isNull(loginUser)) {
+            List<String> list = StringUtils.splitList(loginId.toString(), ":");
+            return new ArrayList<>(permissionService.getRolePermission(Long.parseLong(list.get(1))));
+        }
         UserType userType = UserType.getUserType(loginUser.getUserType());
-        if (userType == UserType.SYS_USER) {
-            return new ArrayList<>(loginUser.getRolePermission());
-        } else if (userType == UserType.APP_USER) {
+        if (userType == UserType.APP_USER) {
             // 其他端 自行根据业务编写
         }
-        return new ArrayList<>();
+        // SYS_USER 默认返回权限
+        return new ArrayList<>(loginUser.getRolePermission());
     }
 }

+ 31 - 0
ruoyi-common/ruoyi-common-service-impl/src/main/java/org/dromara/common/core/service/impl/PermissionServiceImpl.java

@@ -0,0 +1,31 @@
+package org.dromara.common.core.service.impl;
+
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.service.PermissionService;
+import org.dromara.system.api.RemotePermissionService;
+import org.springframework.stereotype.Service;
+
+import java.util.Set;
+
+/**
+ * 权限服务
+ *
+ * @author Lion Li
+ */
+@Service
+public class PermissionServiceImpl implements PermissionService {
+
+    @DubboReference
+    private RemotePermissionService remotePermissionService;
+
+    @Override
+    public Set<String> getRolePermission(Long userId) {
+        return remotePermissionService.getRolePermission(userId);
+    }
+
+    @Override
+    public Set<String> getMenuPermission(Long userId) {
+        return remotePermissionService.getMenuPermission(userId);
+    }
+
+}

+ 1 - 0
ruoyi-common/ruoyi-common-service-impl/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1 +1,2 @@
 org.dromara.common.core.service.impl.DictServiceImpl
+org.dromara.common.core.service.impl.PermissionServiceImpl

+ 32 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemotePermissionServiceImpl.java

@@ -0,0 +1,32 @@
+package org.dromara.system.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.common.core.service.PermissionService;
+import org.dromara.system.service.ISysPermissionService;
+import org.springframework.stereotype.Service;
+
+import java.util.Set;
+
+/**
+ * 权限服务
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemotePermissionServiceImpl implements PermissionService {
+
+    private final ISysPermissionService permissionService;
+
+    @Override
+    public Set<String> getRolePermission(Long userId) {
+        return permissionService.getRolePermission(userId);
+    }
+
+    @Override
+    public Set<String> getMenuPermission(Long userId) {
+        return permissionService.getMenuPermission(userId);
+    }
+}