Keycloak - как обрабатывать несколько рабочих контекстов - PullRequest
0 голосов
/ 03 марта 2019

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

До сих пор у нас было только одно приложение, и мы сохранили всю эту модель разрешений в нашей собственной БД.К сожалению, теперь мы должны поддерживать второе приложение, которое должно наследовать эти разрешения.Мне было интересно, можно ли перевести эту модель в брелок, чтобы нам не приходилось копировать ее на каждый дб и поддерживать синхронизацию вручную.

Я искал документацию keycloak по этой теме, но не нашел никакой информации по всем этим вопросам, что кажется довольно странным, потому что я не думаю, что мы первые работаем с многоконтекстным приложением.

Итак, теперь я спрашиваю, можно ли настроить нашу модель в Keycloak и если да, то как это сделать?В конце концов есть ли другие варианты?Я предполагаю, что могу предоставить эту модель в качестве претензии со структурой json, но мне это не кажется правильным.Я думал о собственном IDP, который мог бы выдвигать такие претензии на основе БД, чтобы не было орфографических ошибок и меньше повторений, но я чувствую, что должен быть лучший способ.

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете попробовать написать свой собственный провайдер Keycloak (SPI).Существует встроенный механизм, который позволяет вам выставлять конечную точку REST на Keycloak: https://github.com/keycloak/keycloak/tree/master/examples/providers/domain-extension Чтобы REST мог быть вызван с авторизованным контекстом только, например, путем передачи Access-Token (заголовок авторизации со значением Bearer).На уровне провайдера (посредством реализации: org.keycloak.services.resource.RealmResourceProviderFactory и org.keycloak.services.resource.RealmResourceProvider) у вас есть доступ к сеансу Keycloak пользователя и объекту UserModel, как показано в следующем коде:

AuthenticationManager.AuthResult authResult = new AppAuthManager().authenticateBearerToken(keycloakSession, keycloakSession.getContext().getRealm());

UserModel userModel = authResult.getUser();

В классе UserModel есть методы для получения и установкиатрибуты, поэтому некоторая информация, которая указывает текущее разрешение / идентификатор компании, может храниться там.Вы можете использовать методы REST, представленные в Keycloak, чтобы изменить модель в рамках «сеанса» (представленного Access-Token).В примере Github также показано, как использовать другого провайдера Keycloak (например, встроенного JPA-провайдера) с уровня вашего нестандартного провайдера, поэтому, используя этот подход, вы можете попытаться подключиться к базе данных с вашими разрешениями / информацией о компании.Конечно, источник данных, представляющий вашу базу данных, также должен быть зарегистрирован как источник данных Keycloak.

...