mediawiki/auth-remoteuser

如果用户已经被远程源认证,则自动登录用户。(例如,环境变量 REMOTE_USER)

2.1.1 2019-11-11 22:07 UTC

README

Auth_remoteuser 是一个适用于 MediaWiki 1.27 及以上版本的扩展,如果用户已经通过远程源认证,则会自动登录 MediaWiki。这可以是任何东西,从 web 服务器环境变量到请求头,再到任意外部源,只要远程用户名映射到本地 wiki 数据库中存在的用户名(或者如果扩展有权限这样做,可以创建它)。外部源负责完全认证授权用户。

因为它是在 MediaWiki 的 AuthManager 堆栈中实现的 SessionProvider,该堆栈自 MediaWiki 1.27 以来引入,所以您需要低于 2.0.0 版本的 Auth_remoteuser 才能在 MediaWiki 1.26 及以下版本中使用此扩展。

要求

  • MediaWiki 1.27+

安装

将此扩展目录 Auth_remoteuser/ 复制到您的 mediawiki 扩展文件夹 extensions/,或者当使用 Composer 安装时,将适当的必需包链接添加到您的 composer.local.json 文件中

"require": { "mediawiki/auth-remoteuser": "~2" }

然后,通过将以下内容添加到您的全局配置文件 LocalSettings.php 中来在 MediaWiki 中启用扩展

wfLoadExtension( 'Auth_remoteuser' );

请考虑 MediaWiki 在您的 LocalSettings.php 中对账户创建的全球权限。至少必须有一个为 true,以便匿名用户可以创建尚未在 wiki 数据库中知名的用户账户。如果您将其设置为 false,则自动登录仅适用于已经拥有 wiki 账户的用户

$wgGroupPermissions['*']['createaccount'] = true;

// If account creation by anonymous users is forbidden, then allow
// it to be created automatically.
$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['*']['autocreateaccount'] = true;

// Only login users automatically if known to the wiki already.
$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['*']['autocreateaccount'] = false;

配置

您可以使用一组以 $wgAuthRemoteuser 开头的全局配置变量来调整扩展的行为以满足您的需求。只需将它们添加到您的 LocalSettings.php 中。默认值已标记为带有 // default 注释,您无需显式设置它们。

  • 设置用于映射到本地 wiki 用户数据库的名称。这可以是简单的字符串、闭包或字符串和/或闭包的混合数组。如果值为 null,则扩展默认使用环境变量 REMOTE_USERREDIRECT_REMOTE_USER。给定列表中第一个可作为有效 MediaWiki 用户名的名称将被用于登录(无论是登录现有 wiki 账户还是创建第一个)。示例

      $wgAuthRemoteuserUserName = null; // default
    
      // Same behaviour as default `null`.
      $wgAuthRemoteuserUserName = [
          $_SERVER[ 'REMOTE_USER' ],
          $_SERVER[ 'REDIRECT_REMOTE_USER' ]
      ];
    
      // Another remote source for user name(s).
      $wgAuthRemoteuserUserName = $_SERVER[ 'LOGON_USER' ];
    
      $wgAuthRemoteuserUserName = ""; // Will evaluate to nothing.
      $wgAuthRemoteuserUserName = []; // Will evaluate to nothing.
    
      // This is not advised, because it will evaluate every visitor
      // to the same wiki user 'Everybody'.
      $wgAuthRemoteuserUserName = "Everybody";
    
      // Create a closure instead of providing strings directly.
      $wgAuthRemoteuserUserName = function() {
          $credentials = explode( ':',$_SERVER['HTTP_AUTHORIZATION']);
          $username = $credentials[0];
          $password = $credentials[1];
          return MyOwnAuthorizer::authenticate( $username, $password )
              ? $username : "";
      };
    
  • 当您需要处理远程用户名,使其可以用于 wiki 用户列表中的标识符之前,例如从末尾删除 Kerberos 实体,替换无效字符或黑名单某些名称时,请使用此扩展提供的 AuthRemoteuserFilterUserName 钩子。只需查看 MediaWiki 钩子文档了解如何将函数注册到该钩子。它将远程用户名作为第一个参数传递给钩子函数的引用。如果函数返回 false,则忽略远程用户名以自动登录。

  • 此扩展包含预定义的远程用户名过滤器(使用上面提到的钩子)。如果您想替换某些内容,请设置以下配置变量的搜索和替换模式数组(每个模式可以是 PCRE 语法的正则表达式)

      $wgAuthRemoteuserUserNameReplaceFilter = null; // default
    
      $wgAuthRemoteuserUserNameReplaceFilter = [
          '_' => ' ',                  // replace underscores with
                                       // spaces
          '@INTRA.EXAMPLE.COM$' => '', // strip Kerberos principal
                                       // from back
          '^domain\\' => '',           // strip NTLM domain from front
          'johndoe' => 'Admin',        // rewrite user johndoe
          '/JaNeDoE/i' => 'Admin',     // rewrite all case-insensitive
                                       // versions of janedoe
          '^(.*)$' => 'auto_$1',       // prepend string 'auto_'
          '^cn=(.*),dc=com$' => '$1',  // get nested user name
          '^([^,]*),(.*)$' => '$2 $1'  // reorder names
      ];
    
  • 如果您想防止某些名称自动登录,可以使用以下过滤器将它们列入黑名单。该过滤器接受一个名称列表,其中每个名称也可以是PCRE语法的正则表达式。

      $wgAuthRemoteuserUserNameBlacklistFilter = null; // default
    
      $wgAuthRemoteuserUserNameBlacklistFilter = [
          'johndoe',
          'janedoe',
          '/john/i', // matches all case-insensitive versions of john
          '^f_'      // matches all users starting wit 'f_'
      ];
    
  • 要实现与UserNameBlacklistFilter相反的效果,可以使用以下过滤器,它允许自动登录而不是阻止。

      $wgAuthRemoteuserUserNameWhitelistFilter = null; // default
    
      $wgAuthRemoteuserUserNameWhitelistFilter = [
          'john',
          'jane'
      ];
    
  • 当您在环境中拥有更多用户信息,这些信息可以与创建的用户相关联时(例如电子邮件地址或真实姓名),请使用以下配置变量之一。可以是UserPrefsUserPrefsForced,它们仅应用于新用户或通过在每个请求上应用它们来强制执行。如果您不希望在MediaWiki中更改用户偏好设置(例如,由远程源提供的公司电子邮件地址),这可能很有用。它们期望一个键值对数组,其中'realname'和'email'对应于新用户的真实姓名和电子邮件地址。任何进一步指定的键值对都将映射到同名用户偏好。但请注意,MediaWiki的$wgDefaultUserOptions$wgHiddenPrefs用于声明用户偏好选项。在大多数情况下,这些全局变量更适合用于定义默认值并禁用它们的可修改性。

      $wgAuthRemoteuserUserPrefs = null;       // default
      $wgAuthRemoteuserUserPrefsForced = null; // default
    
      $wgAuthRemoteuserUserPrefs = [
          'realname' => $_SERVER[ 'AUTHENTICATE_DISPLAYNAME' ],
          'language' => 'en',
          'disablemail' => 0
      ];
      // Users email address should not be changed inside MediaWiki.
      $wgAuthRemoteuserUserPrefsForced = [
          'email' => $_SERVER[ 'AUTHENTICATE_MAIL' ]
      ];
    
      // Instead use MediaWiki global for the preference option.
      $wgDefaultUserOptions[ 'disablemail' ] = 0;
      // And disable it from being changed by the user.
      $wgHiddenPrefs[] = 'disablemail';
      // But change it depending on type of remote user (uses the
      // closure feature described below). For example if there are
      // guest accounts identified by a leading 'g_' existing at your
      // remote source, which have no valid email address, then
      // disable the option specifically for these type of accounts.
      $wgAuthRemoteuserUserPrefsForced = [
          'disablemail' => function ( $metadata ) {
              $name = $metadata[ 'remoteUserName' ];
              return ( preg_match( '/^g_/', $name ) ) ? 1 : 0;
          }
      ];
    

    您也可以为值指定匿名函数。当实际值需要时,这些闭包会被调用,而不是在您的LocalSettings.php中声明时。传递给函数的第一个参数是一个具有以下键的关联数组:

    • userId - 本地维基数据库中用户的id或0(如果为新/匿名用户)。
    • remoteUserName - 环境提供的值。
    • filteredUserName - 运行过滤用户名称钩子后的名称。
    • canonicalUserName - 本地维基数据库中的表示形式。
    • canonicalUserNameUsed - 当前会话中使用的用户名。

    以下是一个示例,其中成本高昂的函数(在时间上)仅针对每个用户执行一次,而不是在每个请求上执行。

      $wgAuthRemoteuserUserPrefs = [
          'email' => function( $metadata ) use ( $rpc ) {
              $name = $metadata[ 'remoteUserName' ];
              // costly remote procedure call to get email address
              return $rpc->query( 'email', $name );
          }
      ];
    
  • 您可以在MediaWiki中指定URL,如果您的远程源更适合处理特定行为。例如,默认情况下,不允许自动登录的用户注销(因为他将在下一个请求中再次自动登录)。但也许您的远程源应该处理注销(因此,下一个请求不再向此扩展提供远程用户名)。将适当的URL设置为关联数组wgAuthRemoteuserUserUrls的以下键之一。

    • logout - 提供用户注销的重定向URL。根据您的其他扩展配置设置,这将替换用户个人URL栏中的注销按钮链接或调用特殊页面Special:UserLogout后的重定向。接受字符串或闭包。如果为闭包类型,则应返回一个包含有效URL的字符串(无论是外部还是内部)。闭包作为第一个参数接收与用户偏好的闭包相同的数组(见那里描述)。

    示例

      $wgAuthRemoteuserUserUrls = null; // default
    
      // Redirect to company domain controller host for logout.
      $wgAuthRemoteuserUserUrls = [
          'logout' => function( $metadata ) {
              $user = $metadata[ 'remoteUserName' ];
              return 'https://company.example.com/?logout=' . $user;
          }
      ];
    
      // Redirect to user login page instead of default logout page.
      // This is the default behaviour if user switching is allowed.
      $wgAuthRemoteuserUserUrls = [
          'logout' => function( $metadata ) {
              return 'Special:UserLogin';
          }
      ];
    
  • 默认情况下,此扩展模仿Auth_remoteuser版本2.0.0之前的版本的行为,禁止使用远程源识别的除本地用户之外的其他用户。您可以使用以下配置更改此行为。

      $wgAuthRemoteuserAllowUserSwitch = false; // default
    
      $wgAuthRemoteuserAllowUserSwitch = true;
    
  • 作为不可变的SessionProvider(见上面的AllowUserSwitch配置)所有特殊页面和用于身份验证的登录/注销链接对于已识别的用户不再需要。如果您仍然希望显示它们,例如,如果您除了使用此之外还使用其他会话提供程序,则可以相应地设置以下内容。

      $wgAuthRemoteuserRemoveAuthPagesAndLinks = true; // default
    
      $wgAuthRemoteuserRemoveAuthPagesAndLinks = false;
    
  • 如果您除了这个之外还使用其他SessionProvider扩展,您必须使用递增的优先级指定它们的含义。

      $wgAuthRemoteuserPriority = 50; // default
    
      $wgAuthRemoteuserPriority = SessionInfo::MAX_PRIORITY;
    

升级

此扩展不使用任何数据库条目,因此您在升级时无需启用此扩展。只需禁用它,升级您的维基后,再重新启用此扩展。

从2.0.0之前的版本升级

所有旧配置参数仍完全受支持。您无需重写旧的LocalSettings.php设置。但为了帮助您将旧配置参数过渡到新参数,以下列表可作指导

  • $wgAuthRemoteuserAuthz - 此参数没有等效的新参数,因为您可以通过不加载扩展来实现相同的功能。
  • $wgAuthRemoteuserName - 已被$wgRemoteuserUserPrefs取代。
  • $wgAuthRemoteuserMail - 已被$wgRemoteuserUserPrefs取代。
  • $wgAuthRemoteuserNotify - 已被$wgRemoteuserUserPrefs取代。
  • $wgAuthRemoteuserDomain - 已被$wgRemoteuserUserNameReplaceFilter取代。
  • $wgAuthRemoteuserMailDomain - 已被$wgRemoteuserUserPrefs取代。

其他注意事项

有关作者完整列表和任何其他文档,请参阅文件extension.json或您启用此扩展后维基安装上的特殊:版本页面。

有关许可证,请参阅文件COPYING