如何保护REST API而非JpaRepository

时间:2018-06-23 04:06:40

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

我正在尝试使用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?

1 个答案:

答案 0 :(得分:0)

  

使用Spring Security而非网络安全保护端点(URL)   方法。 javabullets.com/spring-security-spring-data-rest

请参见艾伦·海斯(Alan Hays)评论