【问题标题】:Spring Boot MVC non-role based securitySpring Boot MVC 非基于角色的安全性
【发布时间】:2015-06-08 14:06:37
【问题描述】:

我正在尝试在新的 Spring Boot MVC 应用程序中设置安全性。我试图在没有 XML 配置的情况下做到这一点,只有 Java。目前,我已经能够在我的每个 @RequestMapping 方法上使用 @Secured 注释来获得基于角色的安全性。

我还需要添加基于对象的安全性,例如:

用户已被授予访问小部件 ID 456 和 689 的权限,并且无法访问任何其他小部件。这显然不是使用基于角色的安全性可以完成的事情,因为理论上可以有无限数量的不同用户可以访问的不同小部件。

为此,据我了解,我需要创建新的 AccessDecisionVoter 和 GrantedAuthority 实现来确定用户是否具有访问小部件的适当权限。

很遗憾,我无法确定这需要如何实现,我正在寻找任何描述如何根据类似要求设置安全性的示例。

【问题讨论】:

    标签: java security spring-mvc spring-boot


    【解决方案1】:

    也许@PreAuthorize 或@PostAuthorize 对你来说就足够了,这取决于你到底需要什么。你可以试试这样:

    @PostAuthorize("returnObject.widget.owner.id == principal.id")
    public Widget getWidgetById(long id) {
       // ...
    return widget;
    }
    

    更新

    自 Spring Security 3.0 起,您可以使用 Pre/Post Authorize,正如您所说,它提供了比 @Secured 更高级的功能。在前/后注释中,您可以使用 SpeL(Spring 表达式语言)。

    如果您想使用前/后注释,您需要在配置中使用:

    <global-method-security pre-post-annotations="enabled" />
    

    示例:让角色为 ROLE_USER 的用户添加文本字段少于 140 个字符的帖子,而角色为 ROLE_PREMIUM 的用户添加任意​​长度的帖子

    @PreAuthorize("(hasRole('ROLE_USER') and #post.text.length() <= 140)
      or hasRole('ROLE_PREMIUM')")
    

    如果任何 Spring Security 注释和 Spel 不允许您制定所需的访问规则,也可以在 PreAuthorize 中使用自定义方法(但我实际上不知道这是否是好的做法):

    @PreAuthorize("hasRole('ROLE_ADMIN') 
    or @mySecurityService.isPostOwner(#post_id, principal.id))")
    

    【讨论】:

    • 我一直在研究 Pre/PostAuthorize 注释,我不得不问,有什么理由使用 Secured 注释吗?似乎 PreAuthorize 可以做所有事情,而且不仅仅是 Secured,还是我错过了什么?
    • 对于没有 XML,我还需要在我的配置中添加以下注释:EnableGlobalMethodSecurity(prePostEnabled = true)
    猜你喜欢
    • 2017-04-04
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2015-01-11
    • 2017-11-29
    • 2013-03-21
    相关资源
    最近更新 更多