spring-security 如何允许某些用户在Sping Boot / Spring Security中使用分页功能只访问端点中自己的数据?

mxg2im7a  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(160)

我有一个关于限制产品列表到我的应用程序中的特定用户的问题。我有一个API:“/api/v1/{userId}/products”,并且我想在我的UserRestController中使用分页,我已经在AdminRestController中使用了该分页:

@GetMapping
    public Response<Page<Product>> getProductPage(@PageableDefault(sort = "id") Pageable pageable) {
        return Response.ok(productService.findAll(pageable));
    }

我已经阅读了一些线程,并找到了一些关于“@PreAuthorize(“#userId == authentication.principal.id“)"的解决方案。现在,我想在UserRestController中的端点中实现分页,它应该只返回与特定用户相关的产品列表(而不是所有产品的列表)。我已经尝试使用以下代码:

@GetMapping("/api/v1/{userId}/products")
@PreAuthorize("#userId == authentication.principal.id")
public Response<Page<Product>> getProductPage(@PageableDefault(sort = "id") Pageable pageable) {
    SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    return Response.ok(productService.findAll(pageable));
}

但是我有访问问题,你能帮我弄清楚吗?
提前感谢!

kokeuurv

kokeuurv1#

它已经在Spring-SecutirySpring-Data中实现。
在config中,您需要添加一个@Bean,以便将您的principal提供给查询:

@Configuration
public class Conf{
    // `principal` provider for the Spring-Data JPQL requests
    @Bean
    public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
      return new SecurityEvaluationContextExtension();
    }
}

在那之后,你就能写这样的东西了:

@RepositoryRestResource(path = "datas", exported = true)
public interface DataRepository extends PagingAndSortingRepository<Data, Long> {

  @Override
  @Query(value = "Select d From Data d Where d.ownerId = ?#{principal?.username}")
  Page<Data> findAll(Pageable pageable);

}

另外,请阅读官方文档:https://docs.spring.io/spring-security/reference/features/integrations/data.html

相关问题