基于Moodle认证插件禁用普通用户密码重置功能的方法
实现方案
完全可以实现你的需求,通过重写Moodle认证插件基类的两个关键方法,就能精准控制密码重置权限:
1. 重写can_reset_password()方法
这个方法用于判断指定用户是否允许发起密码重置请求,我们可以在此区分管理员和普通用户的权限:
/** * 判断用户是否允许发起密码重置请求 * * @param stdClass $user 要检查的用户对象 * @return bool */ public function can_reset_password($user = null) { // 管理员始终允许重置密码 if (!is_null($user) && is_siteadmin($user)) { return true; } // 本插件认证的普通用户禁止重置 return false; }
2. 重写password_reset_requests_allowed()方法
这个方法控制登录页是否显示「忘记密码」链接,直接隐藏普通用户的入口:
/** * 控制是否显示密码重置请求入口(登录页的忘记密码链接) * * @return bool */ public function password_reset_requests_allowed() { // 隐藏普通用户的忘记密码入口 return false; }
3. 管理员重置密码的补充处理
由于你的插件中prevent_local_passwords()返回true,Moodle默认不会存储本地密码,这会导致管理员在后台直接设置用户密码时被阻止。如果需要让管理员能设置Moodle本地临时密码,可以调整这个方法:
public function prevent_local_passwords() { global $USER; // 管理员操作时允许存储本地密码 if (is_siteadmin($USER)) { return false; } // 普通用户仍禁止本地密码存储 return true; }
完整修改后的插件代码
class auth_plugin_myapi extends auth_plugin_base { public function __construct() { $this->authtype = 'myapi'; } private static $userinfo = null; private $cohort; /** * Authenticate user against external API * * @param string $username Username to authenticate * @param string $password Password to authenticate * @return bool Returns true if the user was successfully authenticated, false otherwise. */ public function user_login($username, $password) { // make API call to check authentication // also get user data and store in $userinfo } public function get_userinfo($username) { // Return userdata of user from external API // if username matches $user = self::$userinfo; if ($user == null) { return false; } if ($user->username !== $username) { return false; } return (array) $user; } /** * 控制是否允许本地密码存储 * * @return bool */ public function prevent_local_passwords() { global $USER; // 管理员操作时允许本地密码存储 if (is_siteadmin($USER)) { return false; } // 普通用户禁止本地密码 return true; } /** * 判断用户是否允许发起密码重置请求 * * @param stdClass $user 要检查的用户对象 * @return bool */ public function can_reset_password($user = null) { if (!is_null($user) && is_siteadmin($user)) { return true; } return false; } /** * 控制是否显示密码重置请求入口(登录页的忘记密码链接) * * @return bool */ public function password_reset_requests_allowed() { return false; } }
最终效果
- 普通用户登录页不会显示「忘记密码」链接,即使直接访问
login/forgot_password.php提交请求,也会被权限校验拦截。 - 管理员可通过后台用户管理页面,对任意用户执行密码重置操作(调整
prevent_local_passwords()后,可设置本地临时密码;若保持原逻辑,则需在user_update_password()中补充与外部API的同步逻辑)。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

