Мы сталкиваемся с чем-то довольно странным при использовании разрешений и областей действия от 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, было бы неплохо.