【问题标题】:How to secure REST APIs and not JpaRepository如何保护 REST API 而不是 JpaRepository
【发布时间】:2018-12-02 12:24:49
【问题描述】:

我正在尝试使用 Spring Data、Spring Data JPA 和 Spring Data Rest 获得不安全的 DAO 和安全的 REST API。

例如,我有 DAO 存储库,它不应该受到保护,因为我想从任何地方调用它的方法而无需提供身份验证:

@RepositoryRestResource(exported = false, path = "persons")
public interface UserRepository extends JpaRepository<User, Long> {

    int countByUsername(String username);

    void deleteByUsername(String username);

    Optional<User> findByUsername(String username);
}

我有 REST 存储库,必须使用当前用户的授权保护:

@RepositoryRestResource(path = "persons")
@PreAuthorize("hasAuthority('FETCH_USER')")
public interface UserRestRepository extends PagingAndSortingRepository<User, Long> {

    @PreAuthorize("hasAuthority('DELETE_USER')")
    @Override
    void delete(User user);

    @PreAuthorize("hasAuthority('DELETE_USER')")
    @Override
    void deleteAll();

    @PreAuthorize("hasAuthority('DELETE_USER')")
    @Override
    void deleteAll(Iterable<? extends User> iterable);

    @PreAuthorize("hasAuthority('DELETE_USER')")
    @Override
    void deleteById(Long id);

    @Override
    Iterable<User> findAll();

    @Override
    Page<User> findAll(Pageable pageable);

    @Override
    Iterable<User> findAll(Sort sort);

    @Override
    Iterable<User> findAllById(Iterable<Long> iterable);

    @Override
    Optional<User> findById(Long id);

    @PreAuthorize("hasAuthority('SAVE_USER')")
    @Override
    <S extends User> S save(S s);

    @PreAuthorize("hasAuthority('SAVE_USER')")
    @Override
    <S extends User> Iterable<S> saveAll(Iterable<S> iterable);
}

这里的问题是它似乎自动使用 JpaRepository 来创建和配置 REST 服务,所以我不得不在其上添加 exported = false 以仅公开 REST 存储库的方法,但是仍然存在问题,如果我想在 REST 服务上设置更改路径(对人员),它不起作用,我仍然需要在 JpaRepository 上复制它...

我不应该这样做吗? 难道不能创建一个单独的 JpaRepository 和 PagingAndSortingRepository,一个用于 DAO,另一个用于 REST 吗?

【问题讨论】:

  • 我使用 RepositoryRest 已经很多年了,并且对它有很好的概念和糟糕的性能体验。性能导致我不再使用 RepositoryRest,我不得不撤消 RepositoryRest 的引入。
  • 使用 Spring Security 而不是方法来保护端点(URL)。 javabullets.com/spring-security-spring-data-rest
  • @AlanHay 我终于得到了您的解决方案,它符合我的需求,您介意创建一个答案以便我接受吗?

标签: spring spring-security spring-data spring-data-rest


【解决方案1】:

使用 Spring Security 而不是 方法。 javabullets.com/spring-security-spring-data-rest

查看艾伦·海斯的评论

【讨论】:

    猜你喜欢
    • 2016-09-22
    • 1970-01-01
    • 2019-08-21
    • 2019-04-02
    • 2021-05-16
    • 2019-06-03
    • 2017-04-15
    • 2011-04-23
    相关资源
    最近更新 更多