我想创建一个暴露弹簧数据并保护的实体。示例:
@PreAuthorize("denyAll")
@RepositoryRestResource(path = "exposed-users")
public UserJpaRepository extends JpaRepository<Long, User> {
@Override
@PreAuthorize("hasRole('ADMIN')")
Page<User> findOne(@Param("id") Long id);
}
这可能有点愚蠢(但仅限于示例,在我的情况下稍微复杂一点):只有/exposed-users/{id}
应该可以读取(通过GET),其他一切都应该被拒绝。
问题在于这使得存储库对于应用程序的其余部分不可用,例如userJpaRepository.count()将因@PreAuthorize("denyAll")
而失败。
所以我想为什么不为同一个实体创建两个JpaRepositories:
public InternalUserJpaRepository extends JpaRepository { }
我无法让它工作......但更确切地说,它是随机工作的,有时在默认的/users
映射中没有安全性的用户暴露(因此使用了InternalUserJpaRepository
),有时,在/exposed-users
映射上正确地公开了用户,并具有适当的安全性。
我想删除随机因素: - )
有没有办法正确地做到这一点?
我已经考虑完全抛弃方法安全性并使用WebSecurityConfigurerAdapter(使用ant patterns等),但如果可能的话,我希望保持方法安全性。