问题描述:我正在尝试使用OAuth2访问授权保护资源,其中资源的路径指示资源所有者的所有权。
- 也就是说,我不不想简单地基于一般的正则表达式URL/Scope匹配来访问Client。我希望来自客户端的请求受到与资源服务器URL的单个资源所有权匹配的安全约束(例如由URL参数指示)。
- 我想知道这是否(如果是,如何)可以只用OAuth2来完成。我有疑问,因为它是一个授权协议,而不是一个身份验证协议。好像是for authentication purposes it is often combined with OpenID,所以我想知道这是不是什么阻碍我在这里。
额外要求: - 我想使用推荐的 * 授权代码 * 授权类型。
- 我不想使用现有的授权服务器(GitHub,Google等)。
我发现了什么:我找到了a tutorial和sample code by Baeldung。它工作得很好,接近我想要的设置,但它赠款使用作用域访问,这是 * 通用URL正则表达式匹配器 *。也就是说,在所引用的示例中,客户端(服务)获得对资源服务器的REST API的部分的访问,但是对于资源没有 * 用户 * 所有权的概念,例如作为URL的一部分。也就是说,出现问题的资源似乎属于资源服务器管理员,而不是单个服务用户。
问题:
1.我对OAuth2的理解是否正确,即服务 * 用户 * 拥有的资源的访问委托是一个有效的用例?
例如,我是否可以向希望代表服务用户访问/{someuseridentifier}/someresource
的Client授予访问权限:someuseridentifier
?也就是说,获取一个Client,alan
授权后可以访问/alan/someresource
,但不能访问ada/someresource
。
1.如果这是可能的,什么是干净的方式来做到这一点?直观地说,我会在REST端点中实现一个检查,将Principal
(令牌所有者)与someuseridentifier
(作为URL的一部分)的值进行比较。这条路对吗?我是否可以检索Principal
,作为最初授予资源访问权限的人,或者OAuth2不支持这一点?
1.如果可能的话,是否有比在REST端点中编码比较更好的方法?我可以使用例如。一个WebSecurityConfigurerAdapter
,它拦截入站请求,并在URL上匹配Principal
(从而匹配实际的资源所有者)。
我已经阅读了OAuth2规范followed a setup tutorial,调查了OAuth2 sample setup for access delegation并在stackoverflow上搜索了类似的问题,但似乎没有其他人有这个问题,尽管它被列为as common scenario in literature。我能够使用URL正则表达式匹配来配置一般的管理员访问委托,但不能基于服务-用户。
1条答案
按热度按时间vyswwuz21#
是的,这在一般情况下和OAuth2中都是可能的。我认为首先了解如何在没有OAuth2的情况下做到这一点会有所帮助,因为相同的技术适用于OAuth2和保护资源服务器中的资源。
同样重要的是要注意,资源服务器上的“主体”(包含在
Authentication
中)的概念被Map到授予对客户端的访问权限的用户(通常是访问令牌的主题或"sub"
声明),而不是客户端(通常是访问令牌的受众或"aud"
声明)。事实上,您可以使用授权方案的组合(分层方法),从URL和范围(粗粒度)开始,并在请求/URL级别或方法级别(细粒度)添加其他约束。请考虑以下示例:
个字符
这是一个人为的例子(
userId
是没有意义的),但希望您能理解这一点。访问令牌的作用域为message.read
,因此/{userId}/messages
端点需要用户授予该权限,但资源服务器还需要资源所有者的名称与使用@PreAuthorize
注解的路径变量相匹配,从而保护用户的资源。根据应用程序的域和端点结构,还有很多其他方法可以完成任务,但基本原理是相同的。OpenID Connect不是必需的,因为资源服务器不关心用户是如何被认证的。