#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 примером является ваш код