# 自定义

若系统提供的登录服务不满足您当前的登录需求,可通过一系列的配置定义适合自己业务的登录方式。

# 步骤一:新增登录控制器

新增自定义登录控制器,并实现接口\yunj\app\admin\controller\member\MemberLoginControllerInterface::class

  • 可通过重写loginlogoutgenerateTokengetRequestToken方法来定义登录退出登录生成Token获取请求Token业务逻辑
namespace app\controller\admin\member;

use yunj\app\admin\controller\member\MemberLoginControllerInterface;

class MemberLoginController implements MemberLoginControllerInterface {

    /**
     * 登录
     * @return \think\response\View|\yunj\core\response\Json
     */
    public function login() {
        if (request()->isPost()) {
            // 登录提交处理
            // 获取登录参数,并校验有效性
            $param = request()->all();
            ...
            // 拿到当前登录用户信息
            $member = (new AdminMember())->find('...');
            // 调用登录服务获取授权token
            $data = admin_member_login_service()->login($member);
            $token = $data['token'];    // 登录用户授权token
            $expire = $data['expire'];  // 授权token有效期,单位s
            return success_json(['token' => $token,'expire' => $expire]);
        }
        // 登录页面
        // 用户可自定义登录页面,然后调用相关的登录接口,实现自定义的登录业务
        $vars = [...];
        return $this->view('模板路径', $vars);
    }

    /**
     * 退出/切换账户
     * @return \think\response\Redirect
     */
    public function logout() {
        // 调用登录服务注销当前授权token
        admin_member_login_service()->logout();
        // 跳转到登录页
        return redirect(build_url('yunjAdminMemberLogin'));
    }

    /**
     * 生成token
     * @param AdminMember $member
     * @return string
     */
    public function generateToken(AdminMember $member): string {
        if (!$member) return '';
        return md5($member->id . $member->username . $userAgent ....);
    }

    /**
     * 获取当前token
     * @return string
     */
    public function getRequestToken(): string {
        // 如token放在header里
        $token = request()->header('token');
        return $token ? (string)$token : '';
    }

}

# 步骤二:配置登录控制器

在配置文件yunj\config\admin.php修改登录控制器login_controller配置值

# 步骤三:重置系统路由

为了使新配制的登录控制器生效,

需进入项目根目录执行命令:php think yunj:init-system-routes 重置系统路由;

或进入路由管理页面执行列表右上角系统路由同步功能。