我有一个静态网站,只有当用户通过SAML2 SSO进行身份验证时才能访问其页面。具体来说,这些页面是用Twig编写的,内容存储在JSON文件中,这些JSON文件作为变量提供给Twig模板。
我想知道是否有一种简单的方法来利用PHP框架,如Symfony做到这一点。理想情况下,也没有数据库层。一旦用户通过了身份验证,应该设置一些cookie,只允许他们在需要时漫游。
我的背景是Drupal,所以这就是为什么我在寻找Symfony的方向。
我确实意识到这个问题有点广泛,所以如果有一个更合适的地方来询问这个问题,那么请投票结束并为我指出正确的方向。
我已经完成了这个功能,张贴我的解决方案,在事件这是对其他人有用的线…
对于Symfony 5项目,我使用https://github.com/hslavich/OneloginSamlBundle。根据软件包的README填写config/packages/hslavich_onelogin_saml.yaml
。根据您的SP和IdP的配置方式。一个专业提示,baseurl
配置值应该设置为应用程序域与/saml
连接在一起(例如http://myapp.com/saml
),有一个错误,剥离最后一个路径值(/saml/acs
中的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 & 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验证成功后,用户将被重定向返回并获得会话,然后可以访问站点内的所有路由。