Процесс авторизации состоит из 3 этапов:
- Инициализация (
GET /sso/{type}): Клиент запрашивает вход через конкретного провайдера (например,keycloak). Метод сохраняет метаданные и контекст безопасности в сессию, после чего перенаправляет пользователя на форму авторизации провайдера. - Проверка на стороне провайдера: Пользователь вводит учетные данные на внешней странице Keycloak.
- Обработка ответа : При успешном входе Spring Security перехватывает управление, считывает флаги из сессии возвращает данные пользователя и выполняет динамический редирект на целевой UI-компонент.
Для настройки авторизации на стороне wnam необходимо прописать в application.yaml следующие настройки (на примере keycloak)
security:
oauth2:
client:
registration:
keycloak:
client-id: Идентификатор клиента
client-secret: xhLsyufdaodtkOwdl8Mzb3AxMnoENast
scope:
- profile
- phone
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
keycloak:
authorization-uri: https://<внешняя система>/realms/<ваш realm в keycloak>/protocol/openid-connect/auth
token-uri: https://<внешняя система>/realms/<ваш realm в keycloak>/protocol/openid-connect/token
user-info-uri: https://<внешняя система>/realms/<ваш realm в keycloak>/protocol/openid-connect/userinfo
jwk-set-uri: https://<внешняя система>/realms/<ваш realm в keycloak>/protocol/openid-connect/certs
user-name-attribute: sub
- Идентификатор клиента (Client ID): Данный ID должен быть зарегистрирован в вашем Realm на стороне Keycloak с включенным доступом по секрету (Confidential Client).
- Запрашиваемые права (Scopes):
profile,email,phone. Эти данные запрашиваются у пользователя при первом входе и будут доступны в объектеOAuth2Userпосле успешной расшифровки UserInfo или ID-токена. - Redirect URI: Использование плейсхолдера
{baseUrl}динамически подставляет текущий хост приложения (например,https://my-app.com). Финальный Callback URL в панели Keycloak должен быть строго зафиксирован какhttps://<ваш_домен>/login/oauth2/code/keycloak, иначе провайдер заблокирует запрос с ошибкойinvalid_redirect_uri. - Привязка профиля: Поле
user-name-attribute: subуказывает Spring Security использовать стандартный для OIDC идентификаторsub(Subject) в качестве уникального имени пользователя (Principal.getName()) внутри защищенного контекста приложения.
В конструкторе страниц выбираем шаблон sms.html открываем экспертный режим редактирования и добавляем туда код
<!-- Submit Button keycloak -->
<div class="form-group" style="${template_keycloaksubmitbutton_disabled='display:none'}">
<button type="button" onclick="keycloakSso();" class="btn btn-primary">${template_keycloaksubmitbutton_text='<ru>Войти через кейклок</ru><en>Login with Keycloak</en><kz></kz>'}</button>
</div>
Ниже в скрипт добавляем обработчик
function keycloakSso() {
document.location.href = "/cp/sso/keycloak"
return false;
}
затем после сохранения, в меню упрощенный режим находим пункт "кнопка подтверждения" в нем ставим галочку на keycloak.
Требуемые настройки со стороны keycloak:
1. Создание или выбор Realm
- Перейдите в левое верхнее меню и выберите нужный Realm или создайте его.
2. Создание Клиента (Client)
- Перейдите в раздел Clients -> Create client.
- Client type:
OpenID Connect - Client ID: должно строго совпадать с вашим
application.yml
3. Настройка параметров безопасности (Capability config)
- Client Authentication: Включите переключатель (On). Это сделает клиент типом Confidential (закрытым), после чего Keycloak сгенерирует для него
client-secret. - Authorization: Можно оставить выключенным (Off), если вы управляете ролями на стороне Java.
- Authentication flow: Убедитесь, что установлена галочка только на Standard flow (это и есть
authorization_code, указанный в конфиге). - Нажмите Save.
4. Настройка URL-адресов клиента (Access settings)
После сохранения откроется вкладка Settings для созданного клиента. Настройте следующие поля:
- Root URL: Укажите базовый адрес вашего Java-приложения (например,
https://my-app.comилиhttp://localhost:8080). - Valid Redirect URIs: Самый важный пункт. Укажите точный callback-адрес. В соответствии с вашим шаблоном
{baseUrl}/login/oauth2/code/{registrationId}, значение должно быть:https://my-app.com
(Для локальной разработки можно добавить через плюс:http://localhost:8080/login/oauth2/code/keycloak). - Web Origins: Укажите
+(это автоматически разрешит CORS-запросы с адресов, указанных в Redirect URIs).
5. Получение Client Secret
- В настройках вашего клиента перейдите на вкладку Credentials.
- Скопируйте значение из поля Client Secret.
- Именно оно должно быть прописано у вас в
application.yml. Если в Keycloak секрет другой — обновите его в файле конфигурации вашего приложения.
6. Настройка Scopes (Проверка передачи телефона и почты)
Поскольку в Java-конфиге запрашиваются profile, email и phone, проверьте их наличие:
- Перейдите во вкладку Client scopes внутри настроек клиента.
- Убедитесь, что в таблице присутствуют стримы
profile,emailиphone, а их тип (Assigned type) равен Default. - Если маппинг телефона (
phone) не настроен по умолчанию в вашем Realm, перейдите в глобальный раздел Client Scopes -> phone -> Mappers и убедитесь, что атрибут телефона пользователя из базы Keycloak привязан к Claim в токене (обычно маппер типа User Attribute с именемphone_number).
Можно проверить в тестовом режиме по адресу https://<ваш wnam>/wnam/auth_test при нажатии на ссылку Auth in Keycloak откроется окно авторизации на внешней странице.
после авторизации в кейклоак в браузере вы увидите данные пользователя.
Пример:
Name: [b38676b5-ddba-4f4b-905d-b731e1d9216d], Granted Authorities: [[ROLE_USER, SCOPE_openid roles profile email phone]], User Attributes: [{sub=b38676b5-ddba-4f4b-905d-b731e1d9216d, resource_access={account={roles=[manage-account, manage-account-links, view-profile]}}, email_verified=false, realm_access={roles=[default-roles-wnam, offline_access, uma_authorization]}, name=Вася Пупкин, phone_number=+79229040863, preferred_username=sso-test, given_name=Вася, family_name=Пупкин, email=test@mail.ru}]
При реальной авторизации пользователя данные парсятся заносятся в базу и пользователь получает доступ в интернет.
...

