通过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代码中对其进行评估。
问题是:
根据策略评估 API 的JavaDocs(org.keycloak.authorization.policy.evaluation.Evaluation),我们可以获取
Resource
对象。然而,据我们所知,这个对象包含Keycloak中定义的资源,而不是请求的资源,即它包含带有参数{username}
的URI,但不包含它的具体值。
你有什么想法吗?
交接方法
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这个方法是一个不错的选择。