9.5. Single-Sign-On для приложений CUBA

Single-Sign-On (единый вход, SSO) для приложений CUBA позволяет пользователям входить в несколько запущенных приложений, введя единые имя и пароль один раз в течение сессии веб-браузера.

При использовании SSO существуют два типа приложений:

  • Identity Provider (IDP) - приложение, обеспечивающее аутентификацию пользователей. Оно содержит форму для ввода логина/пароля и выполняет их проверку в соответствии со списком зарегистрированных пользователей. Identity Provider в некоторой SSO-системе может быть только один.

  • Service Provider (SP) - обычное приложение, которое перенаправляет к IDP для аутентификации пользователей. SP должен содержать тот же список пользователей, что и IDP (пароли при этом не важны, так как они проверяются на IDP). SP обеспечивает проверку прав пользователей в соответствии с их ролями и группами доступа. Количество SP в SSO-системе не ограничено.

Приложение может одновременно выполнять функции IDP и SP, то есть установка отдельного IDP не требуется. Функциональность SSO предоставляется модулем cuba-idp, входящим в состав блока Web Client. Приложение можно разрабатывать как обычно, а SSO настроить уже на этапе деплоймента, если требуется.

Warning

CUBA SSO использует собственный протокол, основанный на HTTP, и на данный момент не поддерживает интеграции с системами, использующими стандартные протоколы аутентификации, такие как SAML или OIDC.

При использовании SSO, когда пользователь заходит на адрес SP, он перенаправляется на страницу IDP для ввода имени и пароля. После успешной аутентификации, IDP перенаправляет пользователя обратно в приложение SP, где пользователь входит автоматически.

Для настройки SSO необходимо выполнить следующее:

  • На Identity Provider:

    • Добавьте следующую конфигурацию в файл web.xml модуля web (если вы выполняете настройку на этапе деплоймента, данный файл находится здесь: tomcat/webapps/app/WEB-INF/web.xml):

      <servlet>
          <servlet-name>idp</servlet-name>
          <servlet-class>com.haulmont.idp.sys.CubaIdpServlet</servlet-class>
          <load-on-startup>3</load-on-startup>
      </servlet>
      
      <servlet-mapping>
          <servlet-name>idp</servlet-name>
          <url-pattern>/idp/*</url-pattern>
      </servlet-mapping>
      
      <filter>
          <filter-name>idpSpringSecurityFilterChain</filter-name>
          <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
          <init-param>
              <param-name>contextAttribute</param-name>
              <param-value>org.springframework.web.servlet.FrameworkServlet.CONTEXT.idp</param-value>
          </init-param>
          <init-param>
              <param-name>targetBeanName</param-name>
              <param-value>springSecurityFilterChain</param-value>
          </init-param>
      </filter>
      
      <filter-mapping>
          <filter-name>idpSpringSecurityFilterChain</filter-name>
          <url-pattern>/idp/*</url-pattern>
      </filter-mapping>
    • Установите свойства приложения:

      • cuba.idp.serviceProviderUrls - разделенный запятыми список URL приложений SP (символ / в конце URL обязателен). Например:

        cuba.idp.serviceProviderUrls = http://fish:8081/app/,http://chips:8082/app/
      • cuba.idp.serviceProviderUrlMasks - разделенный запятыми список масок разрешенных URL в формате Java Regex (символ / в конце URL обязателен). Например:

        cuba.idp.serviceProviderUrlMasks = http://your-fish.com/.*,http://your-chips.com/.*
      • cuba.idp.serviceProviderLogoutUrls - разделенный запятой список URL, которые используются для уведомления SP о логауте или истечении сессии пользователей. Стандартные приложения CUBA принимают такие запросы на адресе /dispatch/idpc/logout. Например:

        cuba.idp.serviceProviderLogoutUrls = http://fish:8081/app/dispatch/idpc/logout,http://chips:8082/app/dispatch/idpc/logout
      • cuba.idp.trustedServicePassword - пароль, используемый в коммуникации server-to-server между SP и IDP.

      • Опциональные свойства: cuba.idp.sessionExpirationTimeoutSec, cuba.idp.ticketExpirationTimeoutSec, cuba.idp.sessionExpirationCheckIntervalMs, cuba.idp.cookieMaxAgeSec, cuba.idp.cookieHttpOnly.

  • На Service Providers:

    • Установите свойства приложения:

      • cuba.webAppUrl - URL приложения (символ / в конце обязателен). Данный URL должен быть в списке URL, определенном свойством IDP cuba.idp.serviceProviderUrls. Например:

        cuba.webAppUrl = http://fish:8081/app/
      • cuba.web.idp.enabled должно быть установлено в true.

      • cuba.web.idp.baseUrl - на данном URL IDP принимает запросы на аутентификацию. Стандартный CUBA IDP использует адрес idp/ (символ / в конце обязателен). Например:

        cuba.web.idp.baseUrl = http://main:8080/app/idp/
      • cuba.web.idp.trustedServicePassword - должен быть таким же как заданный для IDP в свойстве cuba.idp.trustedServicePassword.