Spring Boot - CrudRepository过滤器

时间:2017-03-15 11:19:28

标签: spring api spring-boot filter repository

我是Spring Boot的新手,我开始使用一个简单的应用程序,并使用CrudRepositories提供标准的api(GET,POST,PATCH,DELETE)。

  • API /类别
    • 该应用程序的类别和类别都有条目
    • 类别可以标记为机密
  • API /条目
    • 只有具有特定角色的用户才能看到机密类别中的条目。

使用crud存储库的标准公开api有没有一种简单的方法来实现这一点?或者是实现我自己的api端点的唯一安全方法?

类别:

/**
 * A category.
 */
@Entity
@Data
@NoArgsConstructor
@RequiredArgsConstructor
public class Category extends BaseEntity {

    private String description;

    private Boolean confidential;

    @OneToMany(mappedBy = "category")
    @JsonIgnore
    private Set<Entry> entries;

}

CategoryRepository:

/**
 * Spring Data CRUD repository for the Category entity.
 */
@SuppressWarnings("unused")
public interface CategoryRepository extends CrudRepository<Category, Long> { }

参赛作品:

/**
 * A entry.
 */
@Entity
@Data
public class Entry extends AuditingEntity {

    private String title;

    private String value;

    @ManyToOne
    @JsonBackReference
    private Category category;

}

EntryRepository:

/**
 * Spring Data CRUD repository for the Entry entity.
 */
@SuppressWarnings("unused")
public interface EntryRepository extends CrudRepository<Entry, Long> {

    List<Entry> findByCategoryId(@Param("categoryId") long categoryId);

}

2 个答案:

答案 0 :(得分:1)

使用少量配置向项目添加spring-boot-starter-security依赖项应解决您的问题。基本上,您希望根据您的具体需要使用@PreAuthorize和/或@PreFilter注释。

实施例

考虑调整CategoryRepository

public interface CategoryRepository extends CrudRepository<Category, Long> {
    @Override
    @PreFilter("hasRole('ROLE_ADMIN') and filterObject.confidential")
    List<Category> findAll();
}

@PreFilter通过检查用户的过滤对象的角色(ROLE_ADMIN)和confidential属性,定义将在返回对象列表之前应用于列表中每个元素的规则。只需根据您的需要进行调整。

资源

答案 1 :(得分:0)

我会这样做。

List<Category> categories;
if(user is not specific role)
  categories = categoryRepository.findByConfidential(false);
else
  categories = categoryRepository.findAll();

稍后可以使用列表类别列出类别,每个gategory都有方法getEntries()来获取条目列表。