繁体   English   中英

使用自定义范围/角色保护 Spring 启动应用程序

[英]Secure Spring Boot app with custom scopes/roles

在我的 Jersey 应用程序中,我使用@RolesAllowed("my-scope-or-role-name")以及如何从请求中读取范围以确保授权的实现。 例如,当 HTTP header my-role-header的值为my-scope-or-role-name时,我正在处理请求。

@RolesAllowed("my-scope-or-role-name")
public ResponseEntity<Object> post(@RequestBody final String plainText) {
 // process request
}

由于该服务位于代理后面,因此只有该代理可以设置my-header的值,具体取决于它获得的访问令牌。

在 Spring Boot 中解决此问题的惯用方法是什么? 我还阅读了有关使用@Secured注释的信息……但是@RolesAllowed()似乎非常简单。

免责声明:不是专家。

首选方法似乎是使用@PreAuthorize注释。

这个东西接受SpEL表达式,然后允许你(假设已经正确配置了所有的安全性和oauth2内容 - 例如需要启用全局方法级安全性)来做有趣的事情,比如:

@PreAuthorize("#oauth2.hasScope('read') and hasAuthority('USER')")

我(谦卑地)也建议你的REST端点是服务类的瘦包装(然后做实际的工作)。 并且安全注释然后被推入那些服务类(或它们的接口 - 显然你可以注释接口,它仍然有效)。

这应该更加安全,因为如果没有适当的安全许可,任何东西都无法获得“工作”代码。

我知道这是一个旧帖子,但因为它还没有被“回答”,但这里是。

正如 Spring 通常的情况一样,答案实际上比看起来更复杂,而且有不止一种方法可以做到这一点。 (顺便说一下,有相当多的阅读材料。请参阅https://developer.okta.com/blog/2019/06/20/spring-preauthorizehttps://www.marcobehler.com/guides /spring-security以获得关于这个主题的更深入的讨论。)

方法注释或方法安全性是您尝试使用@PreAuthorize执行的操作,它是 Spring Security 支持的三个注释之一。 OP 提到@RolesAllowed ,而@Secured是更特定于 Spring 的第三个注释。 如前所述,使用 SPeL 表达式的能力是使用@PreAuthorize的一个优势,但不是人们使用它的主要原因。 我认为你是否使用一个注释还是另一个注释是一个见仁见智的问题,但它们应该工作相同,前提是你已经注释你的应用程序以支持它们,即@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)取决于你需要什么支持。

通常,方法注释工作正常。 您只需要知道,方法注释只有在您使用我刚才指出的标志启用它时才会起作用。 这也意味着您的安全性分布在您的控制器上,这意味着您只需查看它们就可以了解您的控制器/服务的安全性。 然而,这也确实意味着授权发生在 Spring 调用序列的后面,因此至少在理论上拒绝访问只需要稍微长一点的时间。

另一种方法是通过WebSecurityConfigurerAdapter使用 HttpSecurity 配置。 我在这里看到的优势是您将所有安全性集中在一个地方,并且您仍然可以通过使用.access()链方法来使用 SPeL。 因为 Spring 可以更快地处理此级别的安全性,所以从理论上讲,您的访问拒绝会发生得更快。 我不能说快多少,也许这并不重要,但如果这对你很重要的话,无论如何都要快一些。 如果您有一个 controller 会根据您的访问权限调用多个@Service组件,那么这不起作用。 在这种情况下,您必须使用方法安全性,因为授权需要在调用服务方法之前发生。 不可否认,这不是最好的设计,但我可以看到一个用例。 基本上,如果 URI 不能确定或不能确定安全性,那么您必须通过这些注释来依赖方法安全性。

我不知道这是否回答了这个问题,但希望它能帮助别人。

暂无
暂无

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

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