Dcat 自定义登录如何进行?

Dcat 文档中关于自定义登录描述很少,导致无从下手,具体的编码思路是什么,或者有没有别的参考资料?

自定义登陆《Dcat Admin 中文文档》
Dcat 自定义登录如何进行?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

以钉钉登录为例

登录继承的父类
file
路由文件
file
DingController 控制器

    public function __construct()
    {
        parent::__construct();
        $this->middleware(['web', 'admin'])->except('loginqrCode','login');
    }

    public function loginqrCode()
    {
        $redirect_uri = admin_url('/ding-ding/login');
        return view('code',compact('redirect_uri'));
    }

    public function bindqrCode($id)
    {
        $redirect_uri = admin_url('/ding-ding/bind/'.$id);

        return view('code',compact('redirect_uri'));
    }

    public function bind($id,Request $request)
    {
        $time = (int)now()->getPreciseTimestamp(3);
        if ($request->code) {
            $gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
            $sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
            $signature = base64_encode($sign);
            $urlencode_signature = urlencode($signature);
            $key = env('DT_AUTH_APPID');
            $url = "$gateway?accessKey=$key&timestamp=$time&signature=$urlencode_signature";
            $res = Http::post($url,[
                'tmp_auth_code' => $request->code,
            ]);

            $data = $res->json();

            if ($res->successful() && $data['errcode'] ===0 ) {
                $user = $res['user_info'];
                $d = Ding::where('unionid', $user['unionid'])->first();
                if ($d) {
                    admin_info('钉钉账号','该账号已绑定');
                    return redirect(admin_url('/auth/users'));
                }


                $userid = DingAuth::getUseridByUnionid($user['unionid']);


                $ding = Ding::create([
                    'openid' => $user['openid'],
                    'nick' => $user['nick'],
                    'ding_id' => $user['dingId'],
                    'user_id' => $id,
                    'unionid' => $user['unionid'],
                    'ding_user_id' => '',
                ]);
                $ding_user = DingAuth::user($userid);


                if ($ding_user['errcode'] === 0) {
                    $admin = $ding->User;
                    if (isset($ding_user['email']) && $email = $ding_user['email']){
                        $admin->email = $email;
                    }

                    if (isset($ding_user['mobile']) && $mobile = $ding_user['mobile']) {
                        $admin->phone = $mobile;
                    }

                    if (isset($ding_user['avatar']) && $avatar = $ding_user['avatar']) {
                        if (!$admin->avatar)
                            $admin->avatar = $avatar;
                    }
                    $admin->save();
                }
                admin_success('钉钉账号','绑定成功');
            }else{
                admin_error('钉钉账号', '绑定失败');
            }
            return redirect(admin_url('/auth/users'));
        }
    }



    public function login(Request $request)
    {
        $time = (int)now()->getPreciseTimestamp(3);
        if ($request->code) {
            $gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
            $sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
            $signature = base64_encode($sign);
            $urlencode_signature = urlencode($signature);
            $key = env('DT_AUTH_APPID');
            $url = "$gateway?accessKey=$key&timestamp=$time&signature=$urlencode_signature";
            $res = Http::post($url,[
                'tmp_auth_code' => $request->code,
            ]);
            $data = $res->json();
            if ($res->successful() && $data['errcode'] === 0 ) {
                $user = $res['user_info'];
                $ding = Ding::where('unionid', $user['unionid'])->first();
                if ($ding && $ding->User) {
                    auth('admin')->login($ding->User);

                    return redirect(admin_url('/'));
                }
            }

            admin_error('username','用户不存在');
            return redirect('admin/auth/login');
        }
    }

    public function redirect(Request $request)
    {
        return redirect(admin_url("/ding-ding/login?{$request->getQueryString()}"));
    }

admin.php配置文件

file

file

Laravel

3年前 评论
kownn 3年前
Latent (作者) 3年前
讨论数量: 3

以钉钉登录为例

登录继承的父类
file
路由文件
file
DingController 控制器

    public function __construct()
    {
        parent::__construct();
        $this->middleware(['web', 'admin'])->except('loginqrCode','login');
    }

    public function loginqrCode()
    {
        $redirect_uri = admin_url('/ding-ding/login');
        return view('code',compact('redirect_uri'));
    }

    public function bindqrCode($id)
    {
        $redirect_uri = admin_url('/ding-ding/bind/'.$id);

        return view('code',compact('redirect_uri'));
    }

    public function bind($id,Request $request)
    {
        $time = (int)now()->getPreciseTimestamp(3);
        if ($request->code) {
            $gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
            $sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
            $signature = base64_encode($sign);
            $urlencode_signature = urlencode($signature);
            $key = env('DT_AUTH_APPID');
            $url = "$gateway?accessKey=$key&timestamp=$time&signature=$urlencode_signature";
            $res = Http::post($url,[
                'tmp_auth_code' => $request->code,
            ]);

            $data = $res->json();

            if ($res->successful() && $data['errcode'] ===0 ) {
                $user = $res['user_info'];
                $d = Ding::where('unionid', $user['unionid'])->first();
                if ($d) {
                    admin_info('钉钉账号','该账号已绑定');
                    return redirect(admin_url('/auth/users'));
                }


                $userid = DingAuth::getUseridByUnionid($user['unionid']);


                $ding = Ding::create([
                    'openid' => $user['openid'],
                    'nick' => $user['nick'],
                    'ding_id' => $user['dingId'],
                    'user_id' => $id,
                    'unionid' => $user['unionid'],
                    'ding_user_id' => '',
                ]);
                $ding_user = DingAuth::user($userid);


                if ($ding_user['errcode'] === 0) {
                    $admin = $ding->User;
                    if (isset($ding_user['email']) && $email = $ding_user['email']){
                        $admin->email = $email;
                    }

                    if (isset($ding_user['mobile']) && $mobile = $ding_user['mobile']) {
                        $admin->phone = $mobile;
                    }

                    if (isset($ding_user['avatar']) && $avatar = $ding_user['avatar']) {
                        if (!$admin->avatar)
                            $admin->avatar = $avatar;
                    }
                    $admin->save();
                }
                admin_success('钉钉账号','绑定成功');
            }else{
                admin_error('钉钉账号', '绑定失败');
            }
            return redirect(admin_url('/auth/users'));
        }
    }



    public function login(Request $request)
    {
        $time = (int)now()->getPreciseTimestamp(3);
        if ($request->code) {
            $gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
            $sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
            $signature = base64_encode($sign);
            $urlencode_signature = urlencode($signature);
            $key = env('DT_AUTH_APPID');
            $url = "$gateway?accessKey=$key&timestamp=$time&signature=$urlencode_signature";
            $res = Http::post($url,[
                'tmp_auth_code' => $request->code,
            ]);
            $data = $res->json();
            if ($res->successful() && $data['errcode'] === 0 ) {
                $user = $res['user_info'];
                $ding = Ding::where('unionid', $user['unionid'])->first();
                if ($ding && $ding->User) {
                    auth('admin')->login($ding->User);

                    return redirect(admin_url('/'));
                }
            }

            admin_error('username','用户不存在');
            return redirect('admin/auth/login');
        }
    }

    public function redirect(Request $request)
    {
        return redirect(admin_url("/ding-ding/login?{$request->getQueryString()}"));
    }

admin.php配置文件

file

file

Laravel

3年前 评论
kownn 3年前
Latent (作者) 3年前

文档写的很清楚呀,在AuthController 中重写getLogin和postLogin方法 就可以自定义你的登录视图和登陆逻辑了

3年前 评论

以钉钉登录为例

登录继承的父类
file
路由文件
file
DingController 控制器

    public function __construct()
    {
        parent::__construct();
        $this->middleware(['web', 'admin'])->except('loginqrCode','login');
    }

    public function loginqrCode()
    {
        $redirect_uri = admin_url('/ding-ding/login');
        return view('code',compact('redirect_uri'));
    }

    public function bindqrCode($id)
    {
        $redirect_uri = admin_url('/ding-ding/bind/'.$id);

        return view('code',compact('redirect_uri'));
    }

    public function bind($id,Request $request)
    {
        $time = (int)now()->getPreciseTimestamp(3);
        if ($request->code) {
            $gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
            $sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
            $signature = base64_encode($sign);
            $urlencode_signature = urlencode($signature);
            $key = env('DT_AUTH_APPID');
            $url = "$gateway?accessKey=$key&timestamp=$time&signature=$urlencode_signature";
            $res = Http::post($url,[
                'tmp_auth_code' => $request->code,
            ]);

            $data = $res->json();

            if ($res->successful() && $data['errcode'] ===0 ) {
                $user = $res['user_info'];
                $d = Ding::where('unionid', $user['unionid'])->first();
                if ($d) {
                    admin_info('钉钉账号','该账号已绑定');
                    return redirect(admin_url('/auth/users'));
                }


                $userid = DingAuth::getUseridByUnionid($user['unionid']);


                $ding = Ding::create([
                    'openid' => $user['openid'],
                    'nick' => $user['nick'],
                    'ding_id' => $user['dingId'],
                    'user_id' => $id,
                    'unionid' => $user['unionid'],
                    'ding_user_id' => '',
                ]);
                $ding_user = DingAuth::user($userid);


                if ($ding_user['errcode'] === 0) {
                    $admin = $ding->User;
                    if (isset($ding_user['email']) && $email = $ding_user['email']){
                        $admin->email = $email;
                    }

                    if (isset($ding_user['mobile']) && $mobile = $ding_user['mobile']) {
                        $admin->phone = $mobile;
                    }

                    if (isset($ding_user['avatar']) && $avatar = $ding_user['avatar']) {
                        if (!$admin->avatar)
                            $admin->avatar = $avatar;
                    }
                    $admin->save();
                }
                admin_success('钉钉账号','绑定成功');
            }else{
                admin_error('钉钉账号', '绑定失败');
            }
            return redirect(admin_url('/auth/users'));
        }
    }



    public function login(Request $request)
    {
        $time = (int)now()->getPreciseTimestamp(3);
        if ($request->code) {
            $gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
            $sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
            $signature = base64_encode($sign);
            $urlencode_signature = urlencode($signature);
            $key = env('DT_AUTH_APPID');
            $url = "$gateway?accessKey=$key&timestamp=$time&signature=$urlencode_signature";
            $res = Http::post($url,[
                'tmp_auth_code' => $request->code,
            ]);
            $data = $res->json();
            if ($res->successful() && $data['errcode'] === 0 ) {
                $user = $res['user_info'];
                $ding = Ding::where('unionid', $user['unionid'])->first();
                if ($ding && $ding->User) {
                    auth('admin')->login($ding->User);

                    return redirect(admin_url('/'));
                }
            }

            admin_error('username','用户不存在');
            return redirect('admin/auth/login');
        }
    }

    public function redirect(Request $request)
    {
        return redirect(admin_url("/ding-ding/login?{$request->getQueryString()}"));
    }

admin.php配置文件

file

file

Laravel

3年前 评论
kownn 3年前
Latent (作者) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!