具有Keycloak范围和权限的Quarkus

时间:2020-04-27 13:51:25

标签: keycloak quarkus

在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和范围名称readupdate。如果未为资源填写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,那就太好了。

0 个答案:

没有答案