Keycloak: Как можно отфильтровать пользователя для конкретного клиента OIDC по роли?

#keycloak #openid-connect

#keycloak #OpenID-connect

Вопрос:

У нас есть одна область со многими пользователями и настроенными несколькими клиентами OIDC. Мы хотели бы подключить другое приложение (клиент OIDC) к области. К сожалению, клиент не может проверить наличие каких-либо атрибутов или ролей.

Как я могу настроить Keycloak для аутентификации с определенным OIDC-клиентом, но возвращать неудачную аутентификацию, если у пользователей нет определенной роли?

Ответ №1:

Обычно этот тип опции не будет работать, поскольку перенаправление авторизации происходит до того, как вы узнаете, кто пользователь, и, следовательно, до того, как вы узнаете, какие роли задействованы.

ЧТО бы я СДЕЛАЛ

Перенаправление авторизации выполняет только следующее задание:

  • Вход пользователя и возврат идентификатора пользователя (подзапрос), а также, возможно, пары областей

Затем управляйте ролями в вашем приложении — второе приложение должно вызвать веб-API, который выполняет это:

  • Получайте заявки от токена доступа, а также из других источников, затем используйте их для идентификации и авторизации

Если пользователь проходит аутентификацию, но не имеет права использовать определенное приложение, определите это с помощью вызова API, затем после входа в систему укажите страницу с отказом в доступе в приложении.

Комментарии:

1. Я надеялся, что пользователь сможет пройти аутентификацию в Keycloak, но, возможно, этот Keycloak по-прежнему возвращает не прошедший аутентификацию, если определенная роль отсутствует. Но тогда, похоже, мне нужно искать другого клиента, который способен оценивать роли.

2. Это означало бы смешивание аутентификации и авторизации — сервер авторизации предоставляет вам подтверждение аутентификации данные, необходимые для авторизации. Фактическое принудительное выполнение авторизации должно выполняться в вашем собственном коде.

Ответ №2:

Для достижения этого вы должны реализовать интерфейсы AuthenticatorFactory и Authenticator Keycloak. Смотрите здесь для получения дополнительной информации. В методе authenticate() вы напишете что-то похожее на это:

 If(client == yourClient){
// Check for roles
}
  

В противном случае ожидаемое поведение в случае сбоя.

Комментарии:

1. Спасибо за ваш ответ. Есть ли способ настроить его? Я не хочу выполнять какое-либо жестко заданное правило в коде Java.

2. Я вас не понял, приведите мне пример жестко заданного правила?

3. @HasniIheb примером является ваш код