#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 пользователь перенаправляется обратно и получает сеанс, а затем может получить доступ ко всем маршрутам на сайте.