【发布时间】: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