Приложение Symfony, которое обслуживает статические маршруты веток, закрытые SSO SAML 2.0?

#php #symfony #single-sign-on #saml-2.0

Вопрос:

У меня есть статический веб-сайт, доступ к страницам которого возможен только в том случае, если пользователь прошел аутентификацию с помощью единого входа SAML2. В частности, эти страницы написаны с помощью Twig, а содержимое хранится в файлах JSON, которые передаются в качестве переменных в шаблоны Twig.

Мне было интересно, есть ли простой способ использовать для этого PHP-фреймворк, такой как Symfony. В идеале также не было бы уровня базы данных. Как только пользователь прошел аутентификацию, должен быть установлен какой-то файл cookie, который просто позволяет ему перемещаться по мере необходимости.

Мое прошлое связано с Drupal, поэтому я смотрю в сторону Symfony.

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

Комментарии:

1. Да, очень субъективно относится к самоуверенным ответам. Это определенно возможно, хотя я не уверен в «простом способе». Я бы посоветовал поискать в packagist пакет, поддерживающий SAML2, и посмотреть, сможете ли вы найти тот, который поддерживается и соответствует вашим требованиям.

Ответ №1:

Я выполнил эту функцию, опубликовав свое решение на случай, если это будет полезно кому-то еще в будущем…

Для проекта Symfony 5 я использовал https://github.com/hslavich/OneloginSamlBundle. Заполните в config/packages/hslavich_onelogin_saml.yaml соответствии с упаковкой README.md, и в соответствии с тем, как настроены ваши SP и IdP. Один совет профессионала: значение baseurl конфигурации должно быть установлено в домене приложения с /saml привязкой к нему (например http://myapp.com/saml ), есть ошибка, которая удаляет все, что находится между последним значением пути ( acs in /saml/acs ) и доменом.

Обновите config/packages/security.yaml , чтобы выглядеть примерно так:

 security:
    enable_authenticator_manager: true
    # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
    providers:
        saml_provider:
            saml:
                user_class: AppSecurityUser
                default_roles:
                    - ROLE_USER
        # used to reload user from session amp; other features (e.g. switch_user)
        app_user_provider:
            id: AppSecurityUserProvider
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        app:
            saml:
                provider: saml_provider
                # Match SAML attribute 'uid' with username.
                # Uses getNameId() method by default.
                username_attribute: eduPersonTargetedID
                # Use the attribute's friendlyName instead of the name
                check_path: saml_acs
                login_path: saml_login
            logout:
                path: saml_logout
        main:
            lazy: true
            provider: app_user_provider

            # activate different ways to authenticate
            # https://symfony.com/doc/current/security.html#the-firewall

            # https://symfony.com/doc/current/security/impersonating_user.html
            # switch_user: true

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    access_control:
        - { path: ^/saml/login, roles: PUBLIC_ACCESS }
        - { path: ^/saml/metadata, roles: PUBLIC_ACCESS }
        - { path: ^/, roles: ROLE_USER }
 

Конечный результат является /saml/login и /saml/metadata является общедоступным, в то время как все другие маршруты требуют этой ROLE_USER роли. После успешной аутентификации с помощью IdP пользователь перенаправляется обратно и получает сеанс, а затем может получить доступ ко всем маршрутам на сайте.