You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:55:09