Spring Data Rest with Spring Security - 按当前用户查找所有内容

Posted

技术标签:

【中文标题】Spring Data Rest with Spring Security - 按当前用户查找所有内容【英文标题】:Spring Data Rest with Spring Security - find all by current user 【发布时间】:2018-04-10 00:56:48 【问题描述】:

是否可以使用 Spring Data Rest 和 Spring Security 返回当前用户相关实体,使用 findAll() 方法而不在 GET 查询参数中指定此用户? 我唯一的解决方案是将用户作为参数传递,但也许这是从 SpringSecurityContext 获取他的另一种选择

public interface InvoiceRepository extends CrudRepository<Invoice, Long> 
@RestResource
@PreAuthorize("hasRole('ROLE_ADMIN') or user?.username == authentication.name")
List<Invoice> findAllByUser(@Param("user") User user);

【问题讨论】:

【参考方案1】:

您可以使用SpEL EvaluationContext extension 使安全属性和表达式在@Query 注释中的SpEL 表达式中可用。这允许您仅获取与当前用户相关的那些业务对象:

interface SecureBusinessObjectRepository extends Repository<BusinessObject, Long> 

    @Query("select o from BusinessObject o where o.owner.emailAddress like ?#hasRole('ROLE_ADMIN') ? '%' : principal.emailAddress")
    List<BusinessObject> findBusinessObjectsForCurrentUser();

更多详情请联系here。

【讨论】:

@Cepr0 不错的答案,但是在这里我们需要做额外的查询,而且我们没有使用 jpa 存储库的全部功能。有没有什么击球手的方式来添加原则。

以上是关于Spring Data Rest with Spring Security - 按当前用户查找所有内容的主要内容,如果未能解决你的问题,请参考以下文章

springelasticsearchdata 性能

REST Security with JWT using Java and Spring Security

是否有适用于 JPA、spring-data、spring-data-rest 的通用 REST 查询语言

Spring-Data-Rest 验证器

排除 Spring-data-rest 资源的部分字段

如何在 Spring-Data-Rest 中实现细粒度的访问控制?