当前位置: 首页 > 面试题库 >

如何使用基于Scope的@PreAuthorize保护spring-security-oauth资源?

寿鸣
2023-03-14
问题内容

我成功配置了spring-security-
oauth2,以便外部应用程序可以通过我的应用程序进行身份验证。但是,基于外部应用程序以及基于用户允许的内容,客户端只能访问我的API的子集。可用子集由OAuth范围确定。

在经典的Spring应用程序中,我可以使用@PreAuthorize来基于角色强制执行边界:

@Controller
public class MyController {
  @PreAuthorize("hasRole('admin')")
  @RequestMapping("...")
  public String doStuff() {
    // ...
  }
}

在使用OAuth并结合作用域而不是角色时,我该怎么做?


问题答案:

Spring
OAuth随附了OAuth2MethodSecurityExpressionHandler,该类增加了使用@PreAuthorize表达式进行此类检查的功能。您需要做的就是注册该类,例如,如果您使用的是Javaconfig,则像这样:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public static class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        return new OAuth2MethodSecurityExpressionHandler();
    }
}

现在您可以简单地使用:

@PreAuthorize("#oauth2.hasScope('requiredScope')")

保护您的请求方法。要查看还可以使用哪些其他方法,请hasScope检查类OAuth2SecurityExpressionMethods

缺点是OAuth2MethodSecurityExpressionHandler扩展了DefaultMethodSecurityExpressionHandler,因此您无法将其与也扩展该类的其他类组合。

或者,您也可以将OAuth范围映射到经典用户角色。



 类似资料:
  • 我成功地配置了spring-security-oauth2,这样外部应用程序就可以使用我的应用程序进行身份验证。然而,基于外部应用程序和用户允许的,客户端应该只能访问我的API的一个子集。可用子集由OAuth作用域确定。 在经典的Spring应用程序中,我可以使用@preauthorize来强制执行基于角色的边界: 当使用OAuth并使用作用域而不是角色时,我如何做到这一点?

  • Spring.version:4.0.5.release Spring security Version:3.2.5.release Spring security oauth版本:2.0.2.release 球衣版本:1.18.1 我想使用Spring security的PreAuthorize注释来保护我的REST API,在这里我定义了被授权访问方法的角色: 当我使用角色为“role_adm

  • 我们正在构建一个REST资源服务器(一个Java示例应用程序),我们计划使用MITREID Connect项目提供的RFC7662定义的标识传播机制来保护它。我们测试了两种配置方法,XML设置,以及添加到resource server类中的基于注释的设置(参见下面附上的示例代码)。 我们的测试显示了Spring Security例程的成功初始化,但是我们没有成功地触发通过授权头的承载令牌通过。请求

  • 有没有办法只使用spring security实现CSRF保护,而不使用身份验证和授权等其他功能? 我尝试了以下配置,但它关闭了spring security的所有功能。想知道是否有一种方法可以配置csrf功能。

  • 问题内容: 我知道保护REST API是一个被广泛评论的话题,但是我无法创建一个符合我的标准的小型原型(并且我需要确认这些标准是现实的)。如何保护资源以及如何使用Spring安全性有很多选择,我需要弄清楚我的需求是否现实。 我的要求 基于令牌的身份验证器-用户将提供其凭据,并获得唯一且受时间限制的访问令牌。我想在自己的实现中管理令牌的创建,检查有效性和到期时间。 某些REST资源将是公开的-完全不

  • 我正在使用Spring应用程序。在浏览器上一切正常。我可以使用现有用户登录,只需提供我的用户名和密码。我也可以注册一个新用户,然后用它登录。 我还可以调用一些RESTendpoint。我没有手动定义这些endpoint。它们是自动创建的,因为我使用的是SpringBootStarter数据rest依赖项。 REST请求的URL如下所示http://localhost:8182/api/v1/rec