【发布时间】:2021-05-23 03:54:29
【问题描述】:
所以我有这个基于动态权限的功能,我正在尝试使用 Spring Boot 实现,对于用户想要执行的每个操作,我想通过检查他的角色来查询数据库以了解该用户是否具有这样的权限或权限,但是一个用户可以有多个角色,现在的问题是我如何对我的存储库中的一组角色执行迭代搜索??? 我的权限库
@Repository
public interface PermissionRepository extends JpaRepository<Permission, Long>{
Permission findByRoleAndEntitiesAndOperations(Set<Role> role, Entities entities, Operations operations);
}
我的角色类如下所示
@Entity
@Data
@NoArgsConstructor
@Table(name = "roles")
public class Role implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long roleId;
private String name;
}
我的权限类看起来像这样
@Entity
@Data
public class Permission implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long permission_id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "role_id")
private Role role;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "entity_id")
private Entities entities;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "operation_id")
private Operations operations;
}
我的实体类看起来像这样
@Entity
@Data
public class Entities implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long entity_id;
private String entity;
}
我的操作类看起来像这样
@Entity
@Data
public class Operations implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long operation_id;
private String name;
}
所以我手动设置了一些默认角色、实体、操作、权限 并在启动时使用 CommandLineRunner 接口持久化它们
例如,这是我的 DefaultEntities 类
@Data
@AllArgsConstructor
public class DefaultEntities {
private final String [] entities = {"Users","Role","Permission","Beat","Genre"};
}
这是我的 DefaultRoles 类
@Getter
@AllArgsConstructor
public class DefaultRoles {
public static final String DEFAULT_ROLE = "ROLE_USER";
public static final String ROLE_ADMIN = "ROLE_ADMIN";
public static final String ROLE_MODERATOR = "ROLE_MODERATOR";
}
这是我的 DefaultOperations 类
@Data
@AllArgsConstructor
public class DefaultOperations {
private final String [] operations = {"CREATE","READ","UPDATE","DELETE"};
}
我已经创建了启动类来将所有默认类中的数据保存到它们的各种表中,例如管理权限的启动类看起来像这样
@Component
@Order(5)
public class AdminPermissionAddition implements CommandLineRunner{
@Autowired
RoleRepository roleRepository;
@Autowired
PermissionRepository permissionRepository;
@Autowired
OperationsRepository operationsRepository;
@Autowired
EntityRepository entityRepository;
@Override
public void run(String... args) throws Exception {
Role rol = roleRepository.findByName(DefaultRoles.ROLE_ADMIN);
List<Role> roles = new ArrayList<>();
roles.add(rol);
List<Operations> operations = operationsRepository.findAll();
List<Entities> entities = entityRepository.findAll();
roles.forEach((role) -> {
entities.forEach((entity) -> {
operations.stream().map((operation) -> {
Permission permission = new Permission();
permission.setEntities(entity);
permission.setOperations(operation);
return permission;
}).map((permission) -> {
permission.setRole(role);
return permission;
}).forEachOrdered((permission) -> {
permissionRepository.save(permission);
});
});
});
}
}
所以我让这个用户拥有多个角色,并且我希望我的权限存储库在用户拥有的角色集中进行搜索,如果该用户的任何角色具有给定的操作并且返回 true 或 false给定实体在权限表中,权限存储库在上面... 如果您认为有更好的方法来实现这一点,请与我分享,我将不胜感激 提前谢谢...
【问题讨论】:
-
请提供更多上下文。例如 Permission 实体。
-
@TamásPollák 我已经更新了...
标签: java spring-boot spring-data-jpa