【问题标题】:HTTP Method SecurityHTTP 方法安全性
【发布时间】:2014-07-09 17:50:55
【问题描述】:

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

我有一个 MongoDB 存储库和资源,我想在其中允许 GET,但不允许其他所有内容。 (POST、UPDATE DELETE 等)

总体思路是允许“用户”按照自己的意愿使用资源,并允许“公共”只读访问权限。

@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);
}

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

【问题讨论】:

    标签: spring-security spring-boot spring-mongo spring-hateoas


    【解决方案1】:

    我猜你正在使用 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。

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

    【讨论】:

    • 感谢您的回答,克里斯。这些信息确实有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2014-01-02
    • 2015-12-07
    相关资源
    最近更新 更多