mediawiki / auth-remoteuser
如果用户已经被远程源认证,则自动登录用户。(例如,环境变量 REMOTE_USER)
Requires
- php: >=5.4.0
- composer/installers: ~1.0.1
Requires (Dev)
This package is auto-updated.
Last update: 2024-08-25 23:14:56 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_USER
和REDIRECT_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' ];
-
当您在环境中拥有更多用户信息,这些信息可以与创建的用户相关联时(例如电子邮件地址或真实姓名),请使用以下配置变量之一。可以是
UserPrefs
或UserPrefsForced
,它们仅应用于新用户或通过在每个请求上应用它们来强制执行。如果您不希望在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
。