1

我正在使用 Spring Boot 构建一个简单的 HATEOAS REST 服务。

我有一个 MongoDB 存储库和资源,我想在其中允许 GET,但不允许其他所有内容。(发布、更新删除等)

一般的想法是允许“用户”按照自己的意愿使用资源并允许“公共”只读访问。

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends MongoRepository<Person, String>
{
    @Secured("ROLE_USER")
    public void delete(Person person);

    @Secured("ROLE_USER")
    public Person save(Person person);

    @Secured("ROLE_USER, ROLE_PUBLIC")
    public Person findOne(String id);
}

我不觉得我以正确的角度接近这个。这样做的首选方法是什么?

4

1 回答 1

2

我猜你正在使用 spring-data-rest 并完全跳过控制器。

您遇到的第一件事是@Secured 需要一系列角色......所以我认为您对 findOne 的检查正在寻找角色ROLE_USER,ROLE_PUBLIC而不是这些角色中的任何一个。将其更改为:

@Secured({"ROLE_USER", "ROLE_PUBLIC"})

可能会解决您的问题。

之后,您有几个选择可以考虑

选项 1:切换到 ROLE_ANONYMOUS 而不是 ROLE_PUBLIC,这是在 Spring Web w/spring security 中为匿名用户分配的默认角色。

选项 2:确保匿名用户拥有 ROLE_PUBLIC(默认情况下他们不会,默认情况下他们拥有 ROLE_ANONYMOUS)。有很多方法可以做到这一点,请参阅http://docs.spring.io/spring-security/site/docs/3.0.x/reference/anonymous.html

选项 3:切换到 @PreAuthorize 注释以保护方法并使用 EL 表达式,例如:

@PreAuthorize("hasRole('ROLE_USER') or isAnonymous()")

请参阅http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html注意您必须启用 post-post 注释处理。

最后一点,ROLE_USER 不是默认角色……对于大多数东西来说,它是 DEFAULT_USER。

这是一个非常开放的问题,有很多解决方案,您必须提供更多背景信息来说明您缩小范围的愿望。

于 2014-07-10T01:23:26.563 回答