修改权限逻辑
This commit is contained in:
@ -86,4 +86,9 @@ public interface CacheNames {
|
||||
*/
|
||||
String ONLINE_TOKEN = "online_tokens";
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
String PROJECT_NAME = "project_name#30d";
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
package org.dromara.common.core.domain.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-08-27 18:14
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class SysProjectRoleMenuVo implements Serializable {
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目菜单权限
|
||||
*/
|
||||
private Set<String> projectPermissions;
|
||||
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
package org.dromara.common.core.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-08-27 17:53
|
||||
*/
|
||||
@Data
|
||||
public class SysProjectRolePermissionVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -6552769878716622338L;
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目菜单权限
|
||||
*/
|
||||
private Set<String> projectRoles;
|
||||
}
|
||||
@ -1,6 +1,9 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
import java.util.Set;
|
||||
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
|
||||
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户权限处理
|
||||
@ -12,17 +15,17 @@ public interface PermissionService {
|
||||
/**
|
||||
* 获取角色数据权限
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @param userId 用户id
|
||||
* @return 角色权限信息
|
||||
*/
|
||||
Set<String> getRolePermission(Long userId);
|
||||
List<SysProjectRolePermissionVo> getRolePermission(Long userId);
|
||||
|
||||
/**
|
||||
* 获取菜单数据权限
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @param userId 用户id
|
||||
* @return 菜单权限信息
|
||||
*/
|
||||
Set<String> getMenuPermission(Long userId);
|
||||
List<SysProjectRoleMenuVo> getMenuPermission(Long userId);
|
||||
|
||||
}
|
||||
|
||||
@ -1,7 +1,10 @@
|
||||
package org.dromara.common.satoken.core.service;
|
||||
|
||||
import cn.dev33.satoken.stp.StpInterface;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
|
||||
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
|
||||
import org.dromara.common.core.enums.UserType;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.service.PermissionService;
|
||||
@ -12,6 +15,9 @@ import org.dromara.system.api.model.LoginUser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* sa-token 权限管理实现类
|
||||
@ -30,17 +36,21 @@ public class SaPermissionImpl implements StpInterface {
|
||||
PermissionService permissionService = getPermissionService();
|
||||
if (ObjectUtil.isNotNull(permissionService)) {
|
||||
List<String> list = StringUtils.splitList(loginId.toString(), ":");
|
||||
return new ArrayList<>(permissionService.getMenuPermission(Long.parseLong(list.get(1))));
|
||||
return getPermissionListByProjectId(permissionService.getMenuPermission(Long.parseLong(list.get(1))), null);
|
||||
} else {
|
||||
throw new ServiceException("PermissionService 实现类不存在");
|
||||
}
|
||||
}
|
||||
UserType userType = UserType.getUserType(loginUser.getUserType());
|
||||
if (userType == UserType.APP_USER) {
|
||||
// 系统用户
|
||||
if (userType == UserType.SYS_USER) {
|
||||
Long projectId = loginUser.getProjectId();
|
||||
List<SysProjectRoleMenuVo> menuPermission = loginUser.getMenuPermission();
|
||||
return getPermissionListByProjectId(menuPermission, projectId);
|
||||
} else if (userType == UserType.APP_USER) {
|
||||
// 其他端 自行根据业务编写
|
||||
}
|
||||
// SYS_USER 默认返回权限
|
||||
return new ArrayList<>(loginUser.getMenuPermission());
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -53,17 +63,21 @@ public class SaPermissionImpl implements StpInterface {
|
||||
PermissionService permissionService = getPermissionService();
|
||||
if (ObjectUtil.isNotNull(permissionService)) {
|
||||
List<String> list = StringUtils.splitList(loginId.toString(), ":");
|
||||
return new ArrayList<>(permissionService.getRolePermission(Long.parseLong(list.get(1))));
|
||||
return getRoleListByProjectId(permissionService.getRolePermission(Long.parseLong(list.get(1))), null);
|
||||
} else {
|
||||
throw new ServiceException("PermissionService 实现类不存在");
|
||||
}
|
||||
}
|
||||
UserType userType = UserType.getUserType(loginUser.getUserType());
|
||||
if (userType == UserType.APP_USER) {
|
||||
// 系统用户
|
||||
if (userType == UserType.SYS_USER) {
|
||||
Long projectId = loginUser.getProjectId();
|
||||
List<SysProjectRolePermissionVo> rolePermission = loginUser.getRolePermission();
|
||||
return getRoleListByProjectId(rolePermission, projectId);
|
||||
} else if (userType == UserType.APP_USER) {
|
||||
// 其他端 自行根据业务编写
|
||||
}
|
||||
// SYS_USER 默认返回权限
|
||||
return new ArrayList<>(loginUser.getRolePermission());
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
private PermissionService getPermissionService() {
|
||||
@ -74,4 +88,60 @@ public class SaPermissionImpl implements StpInterface {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取菜单权限列表
|
||||
*
|
||||
* @param menuPermission 菜单权限
|
||||
* @param projectId 当前用户所在项目id
|
||||
* @return 菜单权限列表
|
||||
*/
|
||||
private List<String> getPermissionListByProjectId(List<SysProjectRoleMenuVo> menuPermission, Long projectId) {
|
||||
if (CollUtil.isNotEmpty(menuPermission)) {
|
||||
if (projectId != null) {
|
||||
Map<Long, List<SysProjectRoleMenuVo>> map = menuPermission.stream()
|
||||
.collect(Collectors.groupingBy(SysProjectRoleMenuVo::getProjectId));
|
||||
if (map.containsKey(projectId)) {
|
||||
return map.get(projectId).stream()
|
||||
.map(SysProjectRoleMenuVo::getProjectPermissions)
|
||||
.flatMap(Set::stream)
|
||||
.filter(s -> !s.isEmpty())
|
||||
.distinct()
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
List<Set<String>> setList = menuPermission.stream().map(SysProjectRoleMenuVo::getProjectPermissions).toList();
|
||||
return setList.stream().flatMap(Set::stream).filter(s -> !s.isEmpty()).distinct().toList();
|
||||
} else {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色权限列表
|
||||
*
|
||||
* @param rolePermission 角色权限
|
||||
* @param projectId 当前用户所在项目id
|
||||
* @return 角色权限列表
|
||||
*/
|
||||
private List<String> getRoleListByProjectId(List<SysProjectRolePermissionVo> rolePermission, Long projectId) {
|
||||
if (CollUtil.isNotEmpty(rolePermission)) {
|
||||
if (projectId != null) {
|
||||
Map<Long, List<SysProjectRolePermissionVo>> map = rolePermission.stream()
|
||||
.collect(Collectors.groupingBy(SysProjectRolePermissionVo::getProjectId));
|
||||
if (map.containsKey(projectId)) {
|
||||
return map.get(projectId).stream()
|
||||
.map(SysProjectRolePermissionVo::getProjectRoles)
|
||||
.flatMap(Set::stream)
|
||||
.filter(s -> !s.isEmpty())
|
||||
.distinct()
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
List<Set<String>> list = rolePermission.stream().map(SysProjectRolePermissionVo::getProjectRoles).toList();
|
||||
return list.stream().flatMap(Set::stream).filter(s -> !s.isEmpty()).distinct().toList();
|
||||
} else {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -10,9 +10,11 @@ import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.dromara.common.core.constant.SystemConstants;
|
||||
import org.dromara.common.core.constant.TenantConstants;
|
||||
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
|
||||
import org.dromara.common.core.enums.UserType;
|
||||
import org.dromara.system.api.model.LoginUser;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@ -38,6 +40,7 @@ public class LoginHelper {
|
||||
public static final String DEPT_NAME_KEY = "deptName";
|
||||
public static final String DEPT_CATEGORY_KEY = "deptCategory";
|
||||
public static final String CLIENT_KEY = "clientid";
|
||||
public static final String PROJECT_KEY = "projectId";
|
||||
|
||||
/**
|
||||
* 登录系统 基于 设备类型
|
||||
@ -55,6 +58,7 @@ public class LoginHelper {
|
||||
.setExtra(DEPT_KEY, loginUser.getDeptId())
|
||||
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
|
||||
.setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory())
|
||||
.setExtra(PROJECT_KEY, loginUser.getProjectId())
|
||||
);
|
||||
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
|
||||
}
|
||||
@ -132,6 +136,13 @@ public class LoginHelper {
|
||||
return Convert.toStr(getExtra(DEPT_CATEGORY_KEY));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目ID
|
||||
*/
|
||||
public static Long getProjectId() {
|
||||
return Convert.toLong(getExtra(PROJECT_KEY));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前 Token 的扩展信息
|
||||
*
|
||||
@ -197,7 +208,8 @@ public class LoginHelper {
|
||||
if (loginUser == null) {
|
||||
return false;
|
||||
}
|
||||
return Convert.toBool(isTenantAdmin(loginUser.getRolePermission()));
|
||||
List<SysProjectRolePermissionVo> rolePermission = loginUser.getRolePermission();
|
||||
return Convert.toBool(isTenantAdmin(rolePermission.getFirst().getProjectRoles()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
package org.dromara.common.core.service.impl;
|
||||
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
|
||||
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
|
||||
import org.dromara.common.core.service.PermissionService;
|
||||
import org.dromara.system.api.RemotePermissionService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 权限服务
|
||||
@ -19,12 +21,12 @@ public class PermissionServiceImpl implements PermissionService {
|
||||
private RemotePermissionService remotePermissionService;
|
||||
|
||||
@Override
|
||||
public Set<String> getRolePermission(Long userId) {
|
||||
public List<SysProjectRolePermissionVo> getRolePermission(Long userId) {
|
||||
return remotePermissionService.getRolePermission(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getMenuPermission(Long userId) {
|
||||
public List<SysProjectRoleMenuVo> getMenuPermission(Long userId) {
|
||||
return remotePermissionService.getMenuPermission(userId);
|
||||
}
|
||||
|
||||
|
||||
@ -33,4 +33,9 @@ public interface TransConstant {
|
||||
*/
|
||||
String OSS_ID_TO_URL = "oss_id_to_url";
|
||||
|
||||
/**
|
||||
* 项目id转名称
|
||||
*/
|
||||
String PROJECT_ID_TO_NAME = "project_id_to_name";
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,37 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
import org.dromara.common.translation.annotation.TranslationType;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.common.translation.core.TranslationInterface;
|
||||
import org.dromara.system.api.RemoteProjectService;
|
||||
|
||||
/**
|
||||
* 项目名称翻译实现
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-09-10 16:13
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@TranslationType(type = TransConstant.PROJECT_ID_TO_NAME)
|
||||
public class ProjectNameTranslationImpl implements TranslationInterface<String> {
|
||||
|
||||
@DubboReference
|
||||
private RemoteProjectService remoteProjectService;
|
||||
|
||||
/**
|
||||
* 翻译
|
||||
*
|
||||
* @param key 需要被翻译的键(不为空)
|
||||
* @param other 其他参数
|
||||
* @return 返回键对应的值
|
||||
*/
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof Long id) {
|
||||
return remoteProjectService.selectProjectNameById(id);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -4,3 +4,4 @@ org.dromara.common.translation.core.impl.DictTypeTranslationImpl
|
||||
org.dromara.common.translation.core.impl.OssUrlTranslationImpl
|
||||
org.dromara.common.translation.core.impl.UserNameTranslationImpl
|
||||
org.dromara.common.translation.core.impl.NicknameTranslationImpl
|
||||
org.dromara.common.translation.core.impl.ProjectNameTranslationImpl
|
||||
|
||||
Reference in New Issue
Block a user