Spring 启动 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;
}
更新
您可以使用 Pre/Post Authorize 自 Spring Security 3.0 以来,正如您所说,它提供了比@Secured 更高级的功能。在 pre/post 注释中,您可以使用 SpeL(Spring 表达式语言)。
如果你想使用 pre/post 注释,你需要在配置中这样做:
<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 安全注释和 Spel 中的任何一个不允许您制定所需的访问规则,也可以在 PreAuthorize 中使用自定义方法(但实际上我不知道这是否是好的做法):
@PreAuthorize("hasRole('ROLE_ADMIN')
or @mySecurityService.isPostOwner(#post_id, principal.id))")
我正在尝试在新的 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;
}
更新
您可以使用 Pre/Post Authorize 自 Spring Security 3.0 以来,正如您所说,它提供了比@Secured 更高级的功能。在 pre/post 注释中,您可以使用 SpeL(Spring 表达式语言)。
如果你想使用 pre/post 注释,你需要在配置中这样做:
<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 安全注释和 Spel 中的任何一个不允许您制定所需的访问规则,也可以在 PreAuthorize 中使用自定义方法(但实际上我不知道这是否是好的做法):
@PreAuthorize("hasRole('ROLE_ADMIN')
or @mySecurityService.isPostOwner(#post_id, principal.id))")