我正在尝试在新的Spring Boot MVC应用程序中设置安全性。我试图这样做没有XML配置,只有Java。目前,我已经能够在每个@RequestMapping方法上使用@Secured注释来获得基于角色的安全性。
我还需要添加基于对象的安全性,例如:
用户已被授予对窗口小部件ID 456和689的访问权限,并且无法访问任何其他窗口小部件。这显然不是使用基于角色的安全性可以实现的,因为理论上可以有不同数量的不同小部件,各种用户可以访问这些小部件。
为此,我理解我需要创建新的AccessDecisionVoter和GrantedAuthority实现,以确定用户是否具有访问窗口小部件的适当权限。
不幸的是,我无法确定如何实现这一点,我正在寻找描述如何根据类似要求设置安全性的任何示例。
答案 0 :(得分: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表达式语言)。
如果你想使用前/后注释,你需要在config中使用它:
<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))")