Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Процесс авторизации состоит из 3 этапов:

  1. Инициализация (GET /sso/{type}): Клиент запрашивает вход через конкретного провайдера (например, keycloak). Метод сохраняет метаданные и контекст безопасности в сессию, после чего перенаправляет пользователя на форму авторизации провайдера.
  2. Проверка на стороне провайдера: Пользователь вводит учетные данные на внешней странице Keycloak.
  3. Обработка ответа : При успешном входе Spring Security перехватывает управление, считывает флаги из сессии возвращает данные пользователя и выполняет динамический редирект на целевой UI-компонент.

Для настройки авторизации на стороне wnam необходимо прописать в application.yaml следующие настройки (на примере keycloak)

security:
oauth2:
client:
registration:
keycloak:
client-id: Идентификатор клиента
client-secret: xhLsyufdaodtkOwdl8Mzb3AxMnoENast
scope:
- profile
- email
- 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

  1. Перейдите в левое верхнее меню и выберите нужный Realm или создайте его.

2. Создание Клиента (Client)

  1. Перейдите в раздел Clients -> Create client.
  2. Client type: OpenID Connect
  3. Client ID: должно строго совпадать с вашим application.yml

3. Настройка параметров безопасности (Capability config)

  1. Client Authentication: Включите переключатель (On). Это сделает клиент типом Confidential (закрытым), после чего Keycloak сгенерирует для него client-secret.
  2. Authorization: Можно оставить выключенным (Off), если вы управляете ролями на стороне Java.
  3. Authentication flow: Убедитесь, что установлена галочка только на Standard flow (это и есть authorization_code, указанный в конфиге).
  4. Нажмите 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

  1. В настройках вашего клиента перейдите на вкладку Credentials.
  2. Скопируйте значение из поля Client Secret.
  3. Именно оно должно быть прописано у вас в application.yml. Если в Keycloak секрет другой — обновите его в файле конфигурации вашего приложения.

6. Настройка Scopes (Проверка передачи телефона и почты)
Поскольку в Java-конфиге запрашиваются profile, email и phone, проверьте их наличие:

  1. Перейдите во вкладку Client scopes внутри настроек клиента.
  2. Убедитесь, что в таблице присутствуют стримы profile, email и phone, а их тип (Assigned type) равен Default.
  3. Если маппинг телефона (phone) не настроен по умолчанию в вашем Realm, перейдите в глобальный раздел Client Scopes -> phone -> Mappers и убедитесь, что атрибут телефона пользователя из базы Keycloak привязан к Claim в токене (обычно маппер типа User Attribute с именем phone_number).

Image Added

Можно проверить в тестовом режиме по адресу https://<ваш wnam>/wnam/auth_test при нажатии на ссылку Auth in Keycloak откроется окно авторизации на внешней странице.

Image Added

после авторизации в кейклоак в браузере вы увидите данные пользователя.

Пример:

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}]

При реальной авторизации пользователя данные парсятся заносятся в базу и пользователь получает доступ в интернет.

...