当前位置: 首页 > 知识库问答 >
问题:

如何使用基于作用域的@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并使用作用域而不是角色时,我如何做到这一点?

共有1个答案

唐和洽
2023-03-14

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')")

以保护请求方法。若要查看有哪些其他方法可用,请查看HasscopeOAuth2SecurityExpressionMethods

缺点是oauth2MethodSecurityExpressionHandler扩展了DefaultMethodSecurityExpressionHandler,因此您不能将它与同样扩展该类的其他类组合。

作为替代方案,您还可以将OAuth作用域映射到经典用户角色。

 类似资料:
  • 问题内容: 我成功配置了spring-security- oauth2,以便外部应用程序可以通过我的应用程序进行身份验证。但是,基于外部应用程序以及基于用户允许的内容,客户端只能访问我的API的子集。可用子集由OAuth范围确定。 在经典的Spring应用程序中,我可以使用@PreAuthorize来基于角色强制执行边界: 在使用OAuth并结合作用域而不是角色时,我该怎么做? 问题答案: Spr

  • 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