在Quarkus中使用Keycloak的权限和作用域时,我们遇到了一些奇怪的事情。
我们要实现的目标:使用具有范围和资源(https://www.keycloak.org/docs/latest/authorization_services/#_permission_create_scope)的Keycloak设置经过身份验证和授权的HTTP API。
我们有以下application.properties
文件:
quarkus.log.level=DEBUG
quarkus.oidc.auth-server-url=<keycloak-url>
quarkus.oidc.client-id=<client-id>
quarkus.oidc.credentials.secret=<secret>
quarkus.http.cors=true
quarkus.keycloak.policy-enforcer.enable=true
quarkus.keycloak.policy-enforcer.enforcement-mode=ENFORCING
quarkus.keycloak.policy-enforcer.lazy-load-paths=true
在此属性文件中,对我们而言重要的是策略执行器的启用,但是在这种情况下,这是正常配置,只需指出一下即可。
我们有一个资源名称Test
和范围名称read
和update
。如果未为资源填写URI,我们将无法从keycloak获得正确的权限。从我们将其与quarkus URI匹配的那一刻起,我们就可以使用以下代码段获取此权限块,但只能获取该权限块:
public CompletionStage<Tenant> getByName(@PathParam String name) {
return identity.checkPermission(new KeycloakPermission("resource-guid", "read")).thenApply(
authorized -> {
if (!authorized){
throw new ForbiddenException("Not allowed to read");
}
return new Test(name);
}
);
}
KeycloakPermission
看起来像这样:
public class KeycloakPermission extends BasicPermission {
private final String actions;
public KeycloakPermission(final String name, final String actions) {
super(name, actions);
this.actions = actions;
}
@Override
public String getActions() {
return actions;
}
}
因为否则我找不到任何将操作返回到授权上下文的实现。
我有以下问题:
application.properties
文件中进行配置?resource-name
而不是resource-guid
,则由于以下代码行https://github.com/keycloak/keycloak/blob/ab2d1546b4495b588e45f42dd41f2cebd2d3f796/core/src/main/java/org/keycloak/AuthorizationContext.java#L72,我们方法中的变量authorized
始终为true。这是通过使用资源的ID而不是名称来解决的。我们在这里缺少什么吗?我们只希望用户在特定资源具有作用域时得到授权,但是在密钥库资源中添加填充URI时会自动填充PathConfig current
。PS:如果有人能够添加标签quarkus-keycloak,那就太好了。