fix(permission): 修复 JPA 查询兼容性问题

- 修改 UserRoleRepository 使用两步查询替代 JOIN...ON
- 修改 RolePermissionRepository 使用两步查询
- 修改 PermissionCheckService 使用新的查询方法
- 修改 RoleRepository 使用 @Query 注解
- 修复测试文件中的实体类访问修饰符

注:PermissionSchemaVerificationTest 有环境问题待修复
This commit is contained in:
Your Name
2026-03-05 07:46:03 +08:00
parent 64bae7c13b
commit ddae0432f4
5 changed files with 59 additions and 26 deletions

View File

@@ -3,6 +3,7 @@ package com.mosquito.project.permission;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -46,7 +47,7 @@ public class PermissionCheckService {
* 检查用户是否拥有指定角色 * 检查用户是否拥有指定角色
*/ */
public boolean hasRole(Long userId, String roleCode) { public boolean hasRole(Long userId, String roleCode) {
List<String> userRoles = userRoleRepository.findRoleCodesByUserId(userId); Set<String> userRoles = getUserRoleCodes(userId);
return userRoles.contains(roleCode); return userRoles.contains(roleCode);
} }
@@ -88,15 +89,26 @@ public class PermissionCheckService {
* 获取用户角色代码列表 * 获取用户角色代码列表
*/ */
private Set<String> getUserRoleCodes(Long userId) { private Set<String> getUserRoleCodes(Long userId) {
List<String> roleCodes = userRoleRepository.findRoleCodesByUserId(userId); // 1. 获取用户所有角色ID
return Set.copyOf(roleCodes); List<Long> roleIds = userRoleRepository.findRoleIdsByUserId(userId);
if (roleIds.isEmpty()) {
return Set.of();
}
// 2. 根据角色ID获取角色代码
return roleIds.stream()
.map(roleId -> roleRepository.findById(roleId))
.filter(Optional::isPresent)
.map(Optional::get)
.map(SysRole::getRoleCode)
.collect(Collectors.toSet());
} }
/** /**
* 检查角色是否拥有指定权限 * 检查角色是否拥有指定权限
*/ */
private boolean roleHasPermission(String roleCode, String permissionCode) { private boolean roleHasPermission(String roleCode, String permissionCode) {
List<String> permissions = rolePermissionRepository.findPermissionCodesByRoleCode(roleCode); Set<String> permissions = getRolePermissions(roleCode);
return permissions.contains(permissionCode); return permissions.contains(permissionCode);
} }
@@ -104,7 +116,25 @@ public class PermissionCheckService {
* 获取角色的所有权限 * 获取角色的所有权限
*/ */
private Set<String> getRolePermissions(String roleCode) { private Set<String> getRolePermissions(String roleCode) {
List<String> permissions = rolePermissionRepository.findPermissionCodesByRoleCode(roleCode); // 1. 根据角色代码获取角色ID
return Set.copyOf(permissions); List<Long> roleIds = rolePermissionRepository.findRoleIdsByRoleCode(roleCode);
if (roleIds.isEmpty()) {
return Set.of();
}
// 2. 获取角色所有权限ID
Long roleId = roleIds.get(0);
List<Long> permissionIds = rolePermissionRepository.findPermissionIdsByRoleId(roleId);
if (permissionIds.isEmpty()) {
return Set.of();
}
// 3. 根据权限ID获取权限代码
return permissionIds.stream()
.map(permId -> permissionRepository.findById(permId))
.filter(Optional::isPresent)
.map(Optional::get)
.map(SysPermission::getPermissionCode)
.collect(Collectors.toSet());
} }
} }

View File

@@ -19,16 +19,16 @@ public interface RolePermissionRepository extends JpaRepository<SysRolePermissio
List<SysRolePermission> findByRoleId(Long roleId); List<SysRolePermission> findByRoleId(Long roleId);
/** /**
* 根据角色ID查询所有权限代码 * 根据角色ID查询所有权限代码(两步查询)
*/ */
@Query("SELECT p.permissionCode FROM SysRolePermission rp JOIN SysPermission p ON rp.permissionId = p.id WHERE rp.roleId = :roleId") @Query("SELECT rp.permissionId FROM SysRolePermission rp WHERE rp.roleId = :roleId")
List<String> findPermissionCodesByRoleId(@Param("roleId") Long roleId); List<Long> findPermissionIdsByRoleId(@Param("roleId") Long roleId);
/** /**
* 根据角色代码查询所有权限代码 * 根据角色代码查询所有权限代码(两步查询)
*/ */
@Query("SELECT p.permissionCode FROM SysRolePermission rp JOIN SysPermission p ON rp.permissionId = p.id JOIN SysRole r ON rp.roleId = r.id WHERE r.roleCode = :roleCode") @Query("SELECT r.id FROM SysRole r WHERE r.roleCode = :roleCode")
List<String> findPermissionCodesByRoleCode(@Param("roleCode") String roleCode); List<Long> findRoleIdsByRoleCode(@Param("roleCode") String roleCode);
/** /**
* 检查角色是否拥有指定权限 * 检查角色是否拥有指定权限

View File

@@ -1,6 +1,8 @@
package com.mosquito.project.permission; package com.mosquito.project.permission;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Optional; import java.util.Optional;
@@ -24,5 +26,6 @@ public interface RoleRepository extends JpaRepository<SysRole, Long> {
/** /**
* 根据角色代码查询(排除已删除) * 根据角色代码查询(排除已删除)
*/ */
Optional<SysRole> findByRoleCodeAndDeletedFalse(String roleCode); @Query("SELECT r FROM SysRole r WHERE r.roleCode = :roleCode AND r.deleted = 0")
Optional<SysRole> findByRoleCodeAndDeletedFalse(@Param("roleCode") String roleCode);
} }

View File

@@ -19,10 +19,10 @@ public interface UserRoleRepository extends JpaRepository<SysUserRole, Long> {
List<SysUserRole> findByUserId(Long userId); List<SysUserRole> findByUserId(Long userId);
/** /**
* 根据用户ID查询所有角色代码 * 根据用户ID查询所有角色代码(两步查询)
*/ */
@Query("SELECT r.roleCode FROM SysUserRole ur JOIN SysRole r ON ur.roleId = r.id WHERE ur.userId = :userId AND r.deleted = false") @Query("SELECT ur.roleId FROM SysUserRole ur WHERE ur.userId = :userId")
List<String> findRoleCodesByUserId(@Param("userId") Long userId); List<Long> findRoleIdsByUserId(@Param("userId") Long userId);
/** /**
* 根据用户ID和角色ID查询 * 根据用户ID和角色ID查询

View File

@@ -270,7 +270,7 @@ class PermissionSchemaVerificationTest {
@Entity @Entity
@Table(name = "sys_role") @Table(name = "sys_role")
public class SysRole { class SysRole {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -305,7 +305,7 @@ public class SysRole {
@Entity @Entity
@Table(name = "sys_permission") @Table(name = "sys_permission")
public class SysPermission { class SysPermission {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -340,7 +340,7 @@ public class SysPermission {
@Entity @Entity
@Table(name = "sys_user_role") @Table(name = "sys_user_role")
public class SysUserRole { class SysUserRole {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -363,7 +363,7 @@ public class SysUserRole {
@Entity @Entity
@Table(name = "sys_role_permission") @Table(name = "sys_role_permission")
public class SysRolePermission { class SysRolePermission {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -380,7 +380,7 @@ public class SysRolePermission {
@Entity @Entity
@Table(name = "sys_department") @Table(name = "sys_department")
public class SysDepartment { class SysDepartment {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -409,7 +409,7 @@ public class SysDepartment {
@Entity @Entity
@Table(name = "sys_approval_flow") @Table(name = "sys_approval_flow")
public class SysApprovalFlow { class SysApprovalFlow {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -444,7 +444,7 @@ public class SysApprovalFlow {
@Entity @Entity
@Table(name = "sys_approval_record") @Table(name = "sys_approval_record")
public class SysApprovalRecord { class SysApprovalRecord {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -479,7 +479,7 @@ public class SysApprovalRecord {
@Entity @Entity
@Table(name = "sys_approval_history") @Table(name = "sys_approval_history")
public class SysApprovalHistory { class SysApprovalHistory {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -505,7 +505,7 @@ public class SysApprovalHistory {
@Entity @Entity
@Table(name = "sys_permission_audit") @Table(name = "sys_permission_audit")
public class SysPermissionAudit { class SysPermissionAudit {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@@ -537,7 +537,7 @@ public class SysPermissionAudit {
@Entity @Entity
@Table(name = "sys_sensitive_field") @Table(name = "sys_sensitive_field")
public class SysSensitiveField { class SysSensitiveField {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;