0

0

使用 Symfony 和 SAML 2.0 SSO 保护静态 Twig 路由

DDD

DDD

发布时间:2025-08-30 20:22:01

|

579人浏览过

|

来源于php中文网

原创

使用 symfony 和 saml 2.0 sso 保护静态 twig 路由

本文档介绍如何使用 Symfony 框架和 SAML 2.0 单点登录 (SSO) 来保护静态网站的 Twig 路由。我们将使用 hslavich/OneloginSamlBundle 集成 SAML 认证,并配置 Symfony 的安全组件来限制对特定路由的访问,确保只有经过身份验证的用户才能访问这些页面。

配置 Symfony 项目以支持 SAML 2.0 SSO

本教程将指导你如何设置一个 Symfony 项目,该项目通过 SAML 2.0 SSO 提供静态 Twig 路由。我们将使用 hslavich/OneloginSamlBundle 来简化 SAML 集成。

1. 安装 OneloginSamlBundle

首先,使用 Composer 安装 hslavich/OneloginSamlBundle:

composer require hslavich/onelogin-saml-bundle

2. 配置 OneloginSamlBundle

根据你的服务提供商 (SP) 和身份提供商 (IdP) 的配置,填写 config/packages/hslavich_onelogin_saml.yaml 文件。请参考该 Bundle 的 README.md 文件获取详细的配置说明。

一个重要的注意事项是,baseurl 配置值应该设置为应用程序的域名, 附加 /saml。例如:http://myapp.com/saml。这是因为 Bundle 中存在一个 bug,它会移除最后一个路径值(例如 /saml/acs 中的 acs)和域名之间的所有内容。

一个典型的配置示例如下:

# config/packages/hslavich_onelogin_saml.yaml
hslavich_onelogin_saml:
    sp:
        entityid: "your_sp_entity_id"
        assertion_consumer_service:
            url: "http://myapp.com/saml/acs"
        single_logout_service:
            url: "http://myapp.com/saml/sls"
        NameIDFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
        x509cert: "YOUR_SP_CERTIFICATE"
        privateKey: "YOUR_SP_PRIVATE_KEY"
    idp:
        entityid: "your_idp_entity_id"
        single_sign_on_service:
            url: "your_idp_sso_url"
        single_logout_service:
            url: "your_idp_slo_url"
        x509cert: "YOUR_IDP_CERTIFICATE"
    security:
        username_mapper: Hslavich\OneloginSamlBundle\Security\User\AttributeUserMapper

请确保将 YOUR_SP_CERTIFICATE, YOUR_SP_PRIVATE_KEY, your_idp_entity_id, your_idp_sso_url, your_idp_slo_url 和 YOUR_IDP_CERTIFICATE 替换为你的实际值。

3. 配置 Symfony 安全组件

更新 config/packages/security.yaml 文件以集成 SAML 认证。

security:
    enable_authenticator_manager: true
    providers:
        saml_provider:
            saml:
                user_class: App\Security\User
                default_roles:
                    - ROLE_USER
        app_user_provider:
            id: App\Security\UserProvider # 可选,如果你需要自定义 UserProvider
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        app:
            saml:
                provider: saml_provider
                username_attribute: eduPersonTargetedID # 映射 SAML 属性到用户名
                check_path: saml_acs # SAML Assertion Consumer Service 路径
                login_path: saml_login # SAML 登录路径
            logout:
                path: saml_logout # SAML 登出路径
        main:
            lazy: true
            provider: app_user_provider # 可选,如果你需要自定义 UserProvider

    access_control:
        - { path: ^/saml/login, roles: PUBLIC_ACCESS } # 允许匿名访问 SAML 登录路径
        - { path: ^/saml/metadata, roles: PUBLIC_ACCESS } # 允许匿名访问 SAML 元数据路径
        - { path: ^/, roles: ROLE_USER } # 所有其他路径需要 ROLE_USER 角色

解释:

松果AI写作
松果AI写作

专业全能的高效AI写作工具

下载
  • providers: 定义了 saml_provider,它使用 saml 驱动,并指定了用户类和默认角色。 app_user_provider是可选的,如果需要自定义用户提供者则需要配置。
  • firewalls: 定义了 app 防火墙,它使用 saml 认证。
    • username_attribute: 指定了用于匹配用户名的 SAML 属性。 默认情况下,它使用 getNameId() 方法,但你可以将其配置为使用任何其他的 SAML 属性。
    • check_path: 定义了 SAML Assertion Consumer Service (ACS) 的路径。
    • login_path: 定义了 SAML 登录路径。
    • logout: 定义了 SAML 登出路径。
  • access_control: 定义了访问控制规则。
    • /saml/login 和 /saml/metadata 路径允许公开访问。
    • 所有其他路径需要 ROLE_USER 角色。

4. 创建 User 类 (App\Security\User)

创建一个 App\Security\User 类,实现 Symfony\Component\Security\Core\User\UserInterface 接口。这个类将代表经过 SAML 认证的用户。

username = $username;
        $this->roles = $roles;
    }

    public function getUsername(): string
    {
        return $this->username;
    }

    public function getRoles(): array
    {
        return $this->roles;
    }

    public function getPassword(): ?string
    {
        return null; // SAML 认证不需要密码
    }

    public function getSalt(): ?string
    {
        return null; // SAML 认证不需要 salt
    }

    public function eraseCredentials()
    {
        // 如果需要,可以在这里清除敏感数据
    }

    public function getUserIdentifier(): string
    {
        return $this->username;
    }
}

5. (可选) 创建 UserProvider 类 (App\Security\UserProvider)

如果你需要自定义用户加载逻辑,可以创建一个 App\Security\UserProvider 类,实现 Symfony\Component\Security\Core\User\UserProviderInterface 接口。

loadUserByIdentifier($user->getUserIdentifier());
    }

    public function supportsClass(string $class): bool
    {
        return User::class === $class;
    }

    public function loadUserByUsername(string $username): UserInterface
    {
        return $this->loadUserByIdentifier($username);
    }
}

6. 创建 Twig 模板和控制器

创建你的 Twig 模板和控制器来显示静态内容。例如:

render('home/index.html.twig', [
            'message' => 'Welcome to the secured area!',
        ]);
    }
}
{# templates/home/index.html.twig #}

{{ message }}

You are logged in!

Logout

7. 测试

现在,访问你的应用程序的根路径(例如 http://myapp.com/)。你将被重定向到 IdP 进行身份验证。成功认证后,你将被重定向回应用程序,并可以访问受保护的页面。

总结

通过以上步骤,你已经成功配置了一个 Symfony 项目,该项目使用 hslavich/OneloginSamlBundle 和 SAML 2.0 SSO 来保护静态 Twig 路由。 /saml/login 和 /saml/metadata 路径可以公开访问,而所有其他路由都需要 ROLE_USER 角色。 用户成功通过 IdP 身份验证后,将被重定向回来并获得会话,然后可以访问站点中的所有路由。

注意事项:

  • 确保你的 SP 和 IdP 配置正确。
  • 在生产环境中,使用 HTTPS 来保护 SAML 消息。
  • 定期更新 hslavich/OneloginSamlBundle 以获取最新的安全补丁。
  • 根据你的需求自定义用户加载逻辑。
  • 仔细阅读 hslavich/OneloginSamlBundle 的文档以获取更多高级配置选项。

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

78

2025.09.11

composer是什么插件
composer是什么插件

Composer是一个PHP的依赖管理工具,它可以帮助开发者在PHP项目中管理和安装依赖的库文件。Composer通过一个中央化的存储库来管理所有的依赖库文件,这个存储库包含了各种可用的依赖库的信息和版本信息。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

150

2023.12.25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1049

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

86

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

457

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

11

2026.01.19

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

378

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

413

2023.11.14

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

5

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 22.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号