mediadreams/md_saml

使用SAML认证的单点登录的前端或后端登录。

安装次数: 9,071

依赖关系: 0

建议者: 0

安全: 0

星标: 2

关注者: 3

分支: 9

开放问题: 6

类型:typo3-cms-extension

3.0.5 2024-02-29 06:39 UTC

This package is auto-updated.

Last update: 2024-09-12 06:01:57 UTC


README

TYPO3的单点登录扩展。它允许您使用身份提供者(IdP),例如ADFS服务器(Active Directory Federation Services)登录到TYPO3后端或网站前端。它可以完全通过TypoScript进行配置。

截图

TYPO3登录

TYPO3 login

前端登录

Frontend login

要求

  • 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以获取前端配置。

  • 创建新的信任方信任声明

    1. 欢迎

      • 选择支持声明模式
      • 点击开始按钮
    2. 选择数据源

      • 选择从信任方导入数据选项
      • 选择元数据的XML文件
      • 点击下一步按钮
    3. 输入显示名称

      • 显示名称输入一个值
      • 点击下一步按钮
    4. 选择访问控制策略

      • 选择一个访问控制策略字段中,选择访问-OTP
      • 点击下一步按钮
    5. 准备好添加信任声明

      • 检查数据并点击下一步按钮
    6. 完成

      • 点击关闭按钮
  • 检查配置此应用的请求声明策略

  • 通过添加规则 ...添加新规则

  • 请求规则模板字段中,选择使用自定义规则发送请求并点击下一步按钮

  • 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 选项卡中,在 VertrauensstellungBezeichner 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 项目成为可能的人!

致谢