Quarkus с областями действия Keycloak и разрешениями - PullRequest
1 голос
/ 27 апреля 2020

Мы сталкиваемся с чем-то довольно странным при использовании разрешений и областей действия от Keycloak с Quarkus.
Чего мы хотим достичь sh: настроить HTTP API, аутентифицированный и авторизованный с помощью Keycloak с областями и ресурсами (https://www.keycloak.org/docs/latest/authorization_services/#_permission_create_scope).
У нас есть следующий 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. Мы не можем получить правильные разрешения от keycloak, если URI не заполнен для ресурса. С того момента, как мы сопоставили это с URI quarkus, мы смогли получить этот блок разрешений, но только этот, используя следующий фрагмент:

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;
    }
}

Потому что в противном случае я не смог найти реализацию, которая также возвращает действия в контекст авторизации.
У меня есть следующие вопросы:

  • Можно ли проверить эту комбинацию ресурсов и областей действия?
    • без настройки пути в keycloak
    • путем настройки этого в application.properties -файле?
  • Если мы используем resource-name вместо resource-guid, переменная authorized в нашем методе всегда истинна из-за этой строки кода: https://github.com/keycloak/keycloak/blob/ab2d1546b4495b588e45f42dd41f2cebd2d3f796/core/src/main/java/org/keycloak/AuthorizationContext.java#L72. Это исправлено с помощью идентификатора ресурса, а не имени. Мы что-то здесь упускаем? Мы хотим, чтобы пользователь был авторизован только в том случае, если у него есть область действия для указанного ресурса c, но PathConfig current автоматически заполняется при добавлении заполнения URI в ресурсе keycloak.
  • Мы что-то пропустили пользовательское разрешение создано? Я ожидаю, что это будет где-то доступно?

PS: если кто-то сможет добавить тег quarkus-keycloak, было бы неплохо.

...