我正在寻找一种方法来防止所有用户在Mediawiki中更改其密码(因为帐户创建和密码更改由中央SSO服务器处理).
据我所知,Mediawiki用户可以通过两种方式更改密码:使用登录页面中的"忘记密码链接"(最佳解决方案是在此处显示自定义链接)以及更改功能用户首选项中的密码.
我还没有找到合适的方法,因为这似乎不能通过LocalSettings.php中的简单配置来实现.
很感谢任何形式的帮助.
小智 7
如果您使用的是 MediaWiki 的当前版本(在发布本文时为 1.32,但这可以追溯到 1.18),Carsten Schmitz 接受的答案中的大多数挂钩现在已被弃用或什至已被删除,所以我将使用当前可用的钩子(与 一起使用AuthManager)发布类似的解决方案。
像往常一样,将以下行添加到LocalSettings.php:
这将删除登录页面上的密码重置链接和登录帮助。如果您想添加另一个链接,只需替换false为有效的 HTML 链接,例如<a href="https://urltopasswordchangesite">I forgot my password</a>:
$wgHooks['AuthChangeFormFields'][] = function ( $requests, $fieldInfo, &$formDescriptor, $action ) {
if ($action === "login") {
// Removes the "Help for logging in" link
$formDescriptor["linkcontainer"]["default"] = false;
// Removes the actual password reset link
$formDescriptor["passwordReset"]["default"] = false;
}
return true;
};
Run Code Online (Sandbox Code Playgroud)
此挂钩将删除用户首选项面板中的密码重置按钮:
$wgHooks['GetPreferences'][] = function ( $user, &$preferences ) {
unset( $preferences['password'] );
return true;
};
Run Code Online (Sandbox Code Playgroud)
最后,禁用密码和凭据更改的最简单方法是禁用相应的特殊页面:
$wgHooks['SpecialPage_initList'][] = function ( &$list ) {
unset( $list['ChangeCredentials'] );
unset( $list['PasswordReset'] );
return true;
};
Run Code Online (Sandbox Code Playgroud)
经过一些黑客攻击后,这是完整的解决方案.我没有在任何地方找到它,所以如果它对你有用,请竖起大拇指:
通过将以下更改放入LocalSettings.php来自定义登录屏幕的输出
$wgHooks['UserLoginForm'][] = 'lfChangeLoginPage';
function lfChangeLoginPage( &$template ) {
$template->set('canreset',false); // removes default reset password link
$template->set('resetlink',false);
// Use the following line to show your own 'reset password' link above the login fields
$template->set('link',"<a href='http://www.somedomain.org/lostpassword'>Forgot your password?</a>");
return true;
}
Run Code Online (Sandbox Code Playgroud)
禁用重置密码页面以防有人知道直接URL:
// Disallow password reset on password reset page
$wgHooks['UserLoginMailPassword'][] = 'MailPasswordIsAllowed';
function MailPasswordIsAllowed ( $username, $error ) {
$error = wfMsg( 'resetpass_forbidden' );
return false;
}
Run Code Online (Sandbox Code Playgroud)
禁止在密码更改页面上更改密码(由用户首选项中的链接引用):
$wgHooks['PrefsPasswordAudit'][] = 'ChangePasswordIsAllowed';
function ChangePasswordIsAllowed ( $user ) {
throw new PasswordError( wfMsg( 'resetpass_forbidden' ));
return true;
}
Run Code Online (Sandbox Code Playgroud)
隐藏用户首选项中的密码更改链接:
$wgHooks['GetPreferences'][] = 'RemovePasswordChangeLink';
function RemovePasswordChangeLink ( $user, &$preferences ) {
unset($preferences['password']);
return true;
}
Run Code Online (Sandbox Code Playgroud)