Spring 数据休息 Spring 安全 - 按当前用户查找所有
Spring Data Rest with Spring Security - find all by current user
是否可以使用 Spring Data Rest 和 Spring Security 到 return 当前用户相关实体,使用 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);
您可以使用 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();
}
更多详情。
是否可以使用 Spring Data Rest 和 Spring Security 到 return 当前用户相关实体,使用 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);
您可以使用 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();
}
更多详情