topredmedia / laravel-saml
将 SAML 协议集成到您的网站中,以使其能够作为服务提供商,并允许您的用户对其他 ISP 进行身份验证
Requires
- php: >=7.0.0
- ext-openssl: *
- illuminate/support: >=5.5.0
- onelogin/php-saml: ^3.0.0
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,我们决定进行重写。