【问题标题】:Protect data for spring-data-rest保护 spring-data-rest 的数据
【发布时间】:2020-05-29 00:04:23
【问题描述】:

我正在使用 Spring Data Rest 向我们的 React 前端应用程序公开 JPA 存储库。 而且我还使用 Spring Security 和 JWT 来保护 REST API。

例如,我们有如下实体和存储库:

@Entity
@Table(name = "customer")
public class Customer {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;
  ....
}

public interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> {
}

Spring Data Rest 会将 CustomerRepository 暴露给 REST 端点 /api/customers 所以我们的 React 应用程序可以调用 REST 端点来获取数据。效果很好。

但是,拥有有效 JWT 令牌的人可以使用 Postman 等工具从服务器获取所有客户数据。当然,我们不希望这种情况发生。

我的问题:

  • 如何防止此类异常使用?
  • 使用 Spring Data Rest 的最佳做法是什么?

【问题讨论】:

  • 使用 Spring Security 来保护符合您要求的端点。
  • 是的,我们在项目中使用了 Spring Security。但是,如果是新手用户登录应用程序。一个坏人从他那里窃取令牌并使用 Postman 从服务器获取数据。我们想防止这种情况。我们如何防止这种异常使用?
  • 您可以考虑对普通 Web 应用程序进行基于标准会话的身份验证。 1.stackoverflow.com/questions/34259248/what-if-jwt-is-stolen 2.speakerdeck.com/rdegges/jwts-suck

标签: spring security spring-data-rest


【解决方案1】:

您的应用程序使用 Spring Data REST 公开一个 REST API。您的实体之一是通过CustomerRepository 公开的Customer 实体。在通过调用/api/customers 查询所有实体的列表时,您只希望列出查询主体有权查看的那些Customer 实体。

这可以通过使用@PreFilter@PostFilter 将相关方法注释为explained in the Spring Security reference documentation 来完成。您需要指定某种条件。

一个例子:

@PostFilter(hasPermission(filterObject, 'read'))
public List<Customer> findAll();

请注意,@PostFilter 会遍历返回值,这可能需要一些时间,具体取决于返回列表的大小。

【讨论】:

  • 打破分页,所以有点没用。
猜你喜欢
  • 2019-08-14
  • 2016-02-28
  • 2019-06-19
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多