在Spring Data JPA查询上注入用户



我主要使用过JPA和Hibernate,但我对Spring Data JPA相对陌生。我正在尝试注入记录的用户,以便查询对用户具有可见性限制。

假设我们有这样一个实体:

public class Group {
private String code;
private String name;
private String creationUserId;
}

CreationUserId是实体User的列Id的FK。这试图表示只有Id等于此creationUserId的用户才能访问此组。

所以,考虑到我正在使用JWT(令牌上的主题是userID(和springSecurity(所以用户在SecurityContextHolder.getContext().getAuthentication()中(,有没有像这样的奇特方法

public List<Groups> findMyGroups () {
return groupsRepository.findMyGroups();
}

使用SpringDataJPA提供的功能?

我尽量避免做类似的事情

public List<Groups> findMyGroups () {
MyUser u = (MyUser)SecurityContextHolder.getContext().getAuthentication().getDetails();
return groupsRepository.findGroupsByUserCreationId(u.getId());
}

我这样做没有问题,但这会导致这样的样板,也许有一些变通方法可以实现。

当然,我不希望在每个查询中都出现这种情况,只希望在某些查询中出现这种情况(列表中有两个不同的安全角色,group:readAll和group:readMine(。

Spring Security提供了与Spring Data的集成,以实现您想要的功能。请查看相关的参考文档。

简而言之,您必须添加依赖项并公开类型为SecurityEvaluationContextExtension的Bean,如下所示:

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-data</artifactId>
</dependency>
@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
return new SecurityEvaluationContextExtension();
}

当你有了这个,你可以在查询中使用Authentication

@Query("SELECT g FROM Group g WHERE g.creationUserId = ?#{principal?.id}")
List<Group> readMine();

最新更新