mediadreams / md_saml
使用SAML认证的单点登录的前端或后端登录。
Requires
- php: >=7.4
- onelogin/php-saml: ^4.0
- typo3/cms-backend: ^12.4
- typo3/cms-core: ^12.4
Requires (Dev)
- ergebnis/composer-normalize: ^2.28.3
- friendsofphp/php-cs-fixer: ^3.48.0
- phpstan/extension-installer: ^1.3.1
- phpstan/phpstan: ^1.10.56
- phpstan/phpstan-strict-rules: ^1.5.2
- saschaegerer/phpstan-typo3: ^1.9.1
- squizlabs/php_codesniffer: ^3.8.1
- ssch/typo3-rector: ^1.3
- tomasvotruba/type-coverage: ^0.2.1
- typo3/cms-fluid: ^12.4
- typo3/coding-standards: ^0.6.1
README
TYPO3的单点登录扩展。它允许您使用身份提供者(IdP),例如ADFS服务器(Active Directory Federation Services)登录到TYPO3后端或网站前端。它可以完全通过TypoScript进行配置。
截图
TYPO3登录
前端登录
要求
- TYPO3 v12.4
安装
- 使用以下composer命令安装扩展:
composer req mediadreams/md_saml
或使用扩展管理器 - 包含扩展的静态TypoScript
- 通过设置自己的常量配置扩展
配置
TypoScript
SAML
服务提供者(SP)和身份提供者(IdP)可以通过修改TypoScript中的设置进行配置。
- 将文件
ext:md_saml/Configuration/TypoScript/setup.typoscript
复制到您的自定义扩展,并根据需要修改。 - 为服务提供者(SP)生成证书
openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out sp.crt -keyout sp.key
- 打开证书文件,删除所有换行符。将
sp.crt
的值复制到plugin.tx_mdsaml.settings.saml.sp.x509cert
,将sp.key
的值复制到plugin.tx_mdsaml.settings.saml.sp.privateKey
后端
plugin.tx_mdsaml.settings.be_users.saml.sp.entityId
后端(TYPO3)SP实体的标识符(必须是URI)
注意:baseurl
将自动附加
默认值:/typo3/index.php?loginProvider=1648123062&mdsamlmetadata
plugin.tx_mdsaml.settings.be_users.saml.sp.assertionConsumerService.url
指定有关将后端(TYPO3)登录消息返回给请求者的位置和方式的信息,在本例中是我们的SP。
默认值:/typo3/index.php?loginProvider=1648123062&login-provider=md_saml&login_status=login&acs
saml.sp.assertionConsumerService.auto
如果启用,则从上述URL(assertionConsumerService.url)检测登录,不需要 "?loginProvider=1648123062&login-provider=md_saml&login_status=login&acs&logintype=login" 参数。如果 assertionConsumerService.url 页面上有登录插件且选择了 "getpost" 重新定向方法,则使用给定的 RelayState(应该是引用者)进行重新定向
前端
- 通过设置常量
plugin.tx_mdsaml.settings.fe_users.active = 1
激活前端登录
这将加载不同的登录模板。 plugin.tx_mdsaml.settings.fe_users.saml.sp.entityId
前端SP实体的标识符(必须是URI)
注意:baseurl
将自动附加
示例(只需根据需要替换可说话的路径("/login/”)):/login/?loginProvider=1648123062&mdsamlmetadata
plugin.tx_mdsaml.settings.fe_users.saml.sp.assertionConsumerService.url
指定有关将前端登录消息返回给请求者的位置和方式的信息,在本例中是我们的SP。
示例(只需根据需要替换可说话的路径("/login/”)):/login/?loginProvider=1648123062&login-provider=md_saml&login_status=login&acs&logintype=login
注意
可以在 plugin.tx_mdsaml.settings.saml
中配置的所有默认设置都可以使用 plugin.tx_mdsaml.settings.be_users.saml...
(后端)和 plugin.tx_mdsaml.settings.fe_users.saml...
(前端)中的属性覆盖后端或前端需求。
该库使用OneLogin的SAML工具包作为底层(无需OneLogin账户!)!有关配置的详细信息,请参阅完整的文档。
用户
如果登录时用户不存在,您可以创建新用户。
- 后端
plugin.tx_mdsaml.settings.be_users.createIfNotExist
...
默认值 = 1,因此如果不存在,将创建be_users。 - 前端
plugin.tx_mdsaml.settings.fe_users.createIfNotExist
...
默认值 = 1,因此如果不存在,将创建fe_users。
如果登录时用户已存在,您可以更新现有用户。
- 后端
plugin.tx_mdsaml.settings.be_users.updateIfExist
...
默认值 = 1,因此如果存在,将更新be_users。 - 前端
plugin.tx_mdsaml.settings.fe_users.updateIfExist
...
默认值 = 1,因此如果存在,将更新fe_users。
后端
plugin.tx_mdsaml.settings.be_users.createIfNotExist
决定是否创建新的后端用户(默认 = 1)plugin.tx_mdsaml.settings.be_users.updateIfExist
决定是否更新后端用户(默认 = 1)plugin.tx_mdsaml.settings.be_users.databaseDefaults
...
本节允许您为新创建的后端用户设置默认值。您可以将数据库中的任何字段添加到此。
示例:plugin.tx_mdsaml.settings.be_users.databaseDefaults.usergroup = 123
将创建一个附加了用户组123的新用户。
前端
plugin.tx_mdsaml.settings.fe_users.createIfNotExist
决定是否创建新的前端用户(默认 = 1)plugin.tx_mdsaml.settings.fe_users.updateIfExist
决定是否更新前端用户(默认 = 1)plugin.tx_mdsaml.settings.fe_users.databaseDefaults
...
本节允许您为新创建的前端用户设置默认值。您可以将数据库中的任何字段添加到此。
示例:plugin.tx_mdsaml.settings.fe_users.databaseDefaults.usergroup = 123
将创建一个附加了用户组123的新用户。
注意:plugin.tx_mdsaml.settings.fe_users.databaseDefaults.pid
将用作新创建的fe_users的存储。
SSO
SSO提供者返回的值可以是任何值。通过以下配置设置返回值的名称为TYPO3所需的名称
后端
plugin.tx_mdsaml.settings.be_users.transformationArr
示例:plugin.tx_mdsaml.be_users.settings.transformationArr.username = http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname
以上示例显示了ADFS服务器的返回值,其中包含TYPO3的用户名。
前端
plugin.tx_mdsaml.settings.fe_users.transformationArr
示例:plugin.tx_mdsaml.settings.fe_users.transformationArr.username = http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname
以上示例显示了ADFS服务器的返回值,其中包含前端用户的用户名。
ADFS
以下步骤是配置ADFS服务器作为IdP(身份提供者)的示例。
由于我没有英文配置,以下部分仅提供德语版本。对此表示歉意!
-
获取SP(服务提供者)元数据。登录到TYPO3(非常重要!)并调用
/typo3/index.php?loginProvider=1648123062&mdsamlmetadata&loginType=backend
以获取后端配置以及/typo3/index.php?loginProvider=1648123062&mdsamlmetadata&loginType=frontend
以获取前端配置。 -
创建新的
信任方信任声明
-
欢迎
- 选择
支持声明
模式 - 点击
开始
按钮
- 选择
-
选择数据源
- 选择
从信任方导入数据
选项 - 选择元数据的XML文件
- 点击
下一步
按钮
- 选择
-
输入显示名称
- 为
显示名称
输入一个值 - 点击
下一步
按钮
- 为
-
选择访问控制策略
- 在
选择一个访问控制策略
字段中,选择访问-OTP
- 点击
下一步
按钮
- 在
-
准备好添加信任声明
- 检查数据并点击
下一步
按钮
- 检查数据并点击
-
完成
- 点击
关闭
按钮
- 点击
-
-
检查
配置此应用的请求声明策略
-
通过
添加规则 ...
添加新规则 -
在
请求规则模板
字段中,选择使用自定义规则发送请求
并点击下一步
按钮 -
在
Claim Rule Name
字段中输入值Name Identifier
-
在
Custom Rule
字段中输入以下内容
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"] => issue(Type = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Issuer = c.Issuer, OriginalIssuer = c.OriginalIssuer, Value = c.Value, ValueType = c.ValueType, Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] = "urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName");
-
点击
完成
按钮 -
通过点击
添加规则 ...
添加新规则 -
在
Claim Rule Template
字段中选择值通过自定义规则发送声明
并点击下一步
-
在
Claim Rule Name
字段中输入Data Rule
-
在
Custom Rule
字段中输入以下内容
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname", "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", "distinguishedName", "memberOf"), query = ";mail,displayName,sn,sAMAccountName,distinguishedName,memberOf;{0}", param = c.Value);
-
点击
完成
按钮 -
使用
OK
离开Claim Issuance Policy
注意
规则顺序很重要!第一个必须是 Name Identifier
规则!
最后,还需要在 Bezeichner
选项卡中,在 Vertrauensstellung
的 Bezeichner der vertrauenden Seite
字段中输入在 plugin.tx_mdsaml.settings.mdsamlSpBaseUrl
中输入的值。
TYPO3
常规
- 在 `settings.php` 或 `additional.php`(以前的 `LocalConfiguration.php` 或 `AdditionalConfiguration.php`)中,必须将 `['BE']['cookieSameSite']` 设置为 `lax`
$GLOBALS['TYPO3_CONF_VARS']['BE']['cookieSameSite'] = 'lax'
- 在 `站点配置` 中,将 `入口点`(`base`)的值设置为完全限定的入口点。例如,将 `https://www.domain.tld/` 设置为而不是仅使用 `/`。
站点配置
errorHandling: errorCode: 403 errorHandler: PHP errorPhpClassFQCN: Mediadreams\MdSaml\Error\ForbiddenHandling
更改用户事件
事件以在登录之前插入/更新用户数据
namespace XXX\XXX\EventListener; use Mediadreams\MdSaml\Event\ChangeUserEvent; use TYPO3\CMS\Core\Utility\GeneralUtility; final class AddGroupChangeUserEventListener { protected int $adminGroupUid = 3; // SSO User Changes public function __invoke(ChangeUserEvent $event): void { // get current data $userData = $event->getUserData(); $email = $userData['email'] ?? null; // some conditions, if true add group if (1) { $usergroups = GeneralUtility::intExplode(',', $userData['usergroup']); $usergroups[] = $this->adminGroupUid; // change some data $userData['usergroup'] = implode(',', $usergroups); // save new data $event->setUserData($userData); } } }
您必须在 Services.yaml
中注册事件监听器
常见问题解答
- 是否可以删除带有用户名和密码的默认登录?
- 是的,只需在扩展的 `ext_localconf.php` 中添加以下行
unset($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['backend']['loginProviders'][1433416747]);
- 我得到一个 `1648646492 RuntimeException,无法解析站点配置。
- 请确保您的网站域名已配置在站点配置中(`sites/identifier/config.yaml`)的 `base`。
故障排除
如果您的登录失败,并且带有参数 ?commandLI=setCookie
(typo3/index.php?commandLI=setCookie),请确保您已设置 $GLOBALS['TYPO3_CONF_VARS']['BE']['cookieSameSite'] = 'lax'
。
错误和已知问题
如果您发现错误,请在 Github 上添加问题。
感谢
非常感谢所有使这个卓越的 TYPO3 项目成为可能的人!
致谢
- 感谢 OneLogin 的团队成员,他们提供了 SAML 工具包 for PHP,我正在使用它。
- 扩展图标由 Font Awesome 提供。