如何从Keycloak授权服务策略中请求的资源URI中获取路径参数?

问题描述 投票:0回答:1

通过Keycloak授权服务(版本11.0),我们希望实现以下规则(路径和声明仅用于演示):

如果访问令牌中声明

/users/{username}/more/sub/pathes
的值与所请求资源中参数
username
的值匹配,则允许对资源
username
的请求。

例如:

如果访问令牌中的声明

/users/alice/more/sub/pathes
具有值
username
,则允许对资源
alice
的请求。

如果访问令牌中的声明

/users/bob/more/sub/pathes
具有值
username
,则允许对资源
bob
的请求。

我们可以使用 基于 JavaScript 的策略 创建自己的策略。如示例所示,我们可以从访问令牌中获取任何声明(例如所需的

username
声明)并在我们的JS代码中对其进行评估。

问题是:

  1. 我们如何定义资源 URI 中的路径参数?
  2. 我们如何获取 JS 策略代码中的路径参数?
  3. 如果无法定义路径参数,我们如何至少获取完整的请求资源 URI?

根据策略评估 API 的JavaDocs(org.keycloak.authorization.policy.evaluation.Evaluation),我们可以获取

Resource
对象。然而,据我们所知,这个对象包含Keycloak中定义的资源,而不是请求的资源,即它包含带有参数
{username}
的URI,但不包含它的具体值。

你有什么想法吗?

javascript resources authorization keycloak policy
1个回答
0
投票

交接方法

org.keycloak.adapters.authorization.util.RequestPlaceHolderResolver.resolve(String placeHolder, HttpRequest request)

        ...
        else if (source.startsWith("method")) {
            String value = request.getMethod();

            if (value != null) {
                return Arrays.asList(value);
            }
        } else if (source.startsWith("uri")) {
            String value = request.getURI();

            if (value != null) {
                return Arrays.asList(value);
            }
        } else if (source.startsWith("relativePath")) {
            String value = request.getRelativePath();

            if (value != null) {
                return Arrays.asList(value);
            }
        }
        ... 

只有判断

source.startsWith("uri")
是没有对路径变量的处理支持的,Override这个方法是一个不错的选择。

© www.soinside.com 2019 - 2024. All rights reserved.