topredmedia/laravel-saml

将 SAML 协议集成到您的网站中,以使其能够作为服务提供商,并允许您的用户对其他 ISP 进行身份验证

v1.0.0 2019-03-08 13:49 UTC

This package is auto-updated.

Last update: 2024-09-09 02:03:59 UTC


README

此包允许您定义多个服务提供商,这些提供商可用于对 Laravel 用户进行身份验证。

安装

通过运行以下命令安装包。它将自动安装依赖项。

composer require topredmedia/laravel-saml

SAMLServiceProvider 应该会自动由 Laravel >= 5.5 加载。

要发布配置文件,请运行

php artisan vendor:publish --provider="TopRedMedia\SAML\SAMLServiceProvider"

配置

配置在 config/topredmedia-saml.php 文件中完成。文件分为三个部分

路由前缀

路由前缀条目被添加到每个路由中,默认为 saml

端点

可以定义多个端点,这意味着您可以使用此包从不同的 ISP 识别您的用户。每个端点都有一个键,它也用作路由部分。配置附带了一个 sample 端点,因此对于该端点,登录路由为 https://yourlaravelsite.com/saml/sample/login

默认值

默认数组中的所有设置将内部复制到每个端点定义中。如果端点覆盖了默认值中已定义的键,则无妨。

用法

简略说明

您无需修改路由或控制器。只需监听 TopRedMedia\SAML\UserLoggedInEvent 或 TopRedMedia\SAML\UserLoggedOutEvent 事件。

详细说明

包为每个端点创建五个路由。对于前缀 saml 和端点 google,这些路由将是

  • /saml/google/login - 用于启动登录过程
  • /saml/google/logout - 用于启动注销过程
  • /saml/google/metadata - 用于在 ISP 端创建 SP 的实体 ID URI。
  • /saml/google/sls - SAML 过程中内部使用的 URL。
  • /saml/google/acs - SAML 过程中内部使用的 URL。

将所需 ISP 的信息直接输入到配置文件中,或为该信息创建适当的 env 变量。只需看看示例端点,看看您如何做到这一点。

如果用户成功认证,ISPController 将调度一个 TopRedMedia\SAML\UserLoggedInEvent。它包含一个 TopRedMedia\SAML\SAMLUser 对象,该对象包含您检查用户是否存在或应创建所需的所有信息。只需创建您的监听器,处理事件即可。一个已转储的事件可能具有这些值(取决于您定义的属性)。请注意,它有一个用户对象,该对象本身有一个 SAMLAuth 实例和端点键。

UserLoggedInEvent {#207 ▼
  +user: SAMLUser {#201 ▼
    +auth: Auth {#198 ▼
      -_settings: Settings {#200 ▶}
      -_attributes: array:3 [▼
        "exampleattr" => []
        "firstname" => array:1 [▼
          0 => "Dagobert"
        ]
        "lastname" => array:1 [▼
          0 => "Duck"
        ]
      ]
      -_attributesWithFriendlyName: []
      -_nameid: "dagobert@duck.com"
      -_nameidFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
      -_nameidNameQualifier: null
      -_nameidSPNameQualifier: null
      -_authenticated: true
      -_sessionIndex: "_10...c5f5"
      -_sessionExpiration: null
      -_lastMessageId: "_8e2...77"
      -_lastAssertionId: "_102...f5"
      -_lastAssertionNotOnOrAfter: 1552052840
      -_errors: []
      -_lastErrorException: null
      -_lastError: null
      -_lastRequestID: null
      -_lastRequest: null
      -_lastResponse: DOMDocument {#202 ▶}
    }
    +isp: "sample"
  }
}

如果定义了更多端点,为每个端点创建监听器是完全可以的,并且只有当端点对您的监听器有效时才处理事件。如果您的监听器负责某个事件,只需在监听器中返回 false 来停止 事件传播

致谢

此包在很大程度上受到了 https://github.com/aacotroneo/laravel-saml2 包的影响。由于我们需要多个 ISP,我们决定进行重写。