【问题标题】:Iterative Search in repository (spring boot)存储库中的迭代搜索(spring boot)
【发布时间】: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


【解决方案1】:

感谢您的更新。因此,您的问题中最重要的部分是:我希望我的权限存储库在 用户拥有的角色集中进行搜索,如果该用户的任何角色具有 给定操作和给定实体在权限表中

您的初始存储库查询几乎没有问题。它应该看起来像这样:

@Repository
public interface PermissionRepository extends JpaRepository<Permission, Long>{
    Permission findByRoleInAndEntitiesAndOperations(Set<Role> role, Entities entities, Operations operations);
}

重要的部分是您必须将 findByRole 更改为 -> findByRoleIn(因为您要检查一个集合)

这个查询有可能不起作用,因为比较实体,但您现在了解基本概念。另一种方法是比较 id:

@Repository
public interface PermissionRepository extends JpaRepository<Permission, Long>{
    Permission findByRole_roleIdInAndEntities_Entities_idAndOperations_Operation_id(Set<Long> roleIds, long entityId, long operationId);
}

编辑:您可以使用boolean existsBy.. 代替Permission findBy..。这样您就可以轻松检查布尔结果。如果为true,则权限存在,如果为false,则用户没有该操作的权限。

【讨论】:

  • 非常感谢
猜你喜欢
  • 2021-08-20
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2017-09-25
  • 2021-04-16
相关资源
最近更新 更多