繁体   English   中英

Spring Boot MVC基于非角色的安全性

[英]Spring Boot MVC non-role based security

我正在尝试在新的Spring Boot MVC应用程序中设置安全性。 我正在尝试没有XML配置,只有Java。 目前,我已经可以在每个@RequestMapping方法上使用@Secured批注来获得基于角色的安全性。

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

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

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

不幸的是,我无法确定该如何实现,我正在寻找任何描述如何基于类似要求设置安全性的示例。

也许@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))")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM