laravel-admin實現後臺用戶的快速登錄功能

需求

很常見的功能 就是我們登陸後臺之後 有一個用戶列表
每個用戶有一個一個快速登陸的按鈕,點擊之後直接跳轉到用戶自己的後臺

項目的設計

因爲在一套laravel-admin上去作多用戶後臺是需要一個付費的composer組件(花錢是不可能的!),並且時間關係無法自己套模板去寫
所以一步到位,直接新建一個laravel項目,然後裝上laravel-admin

關於總後臺的登錄處理

很明顯我在總後臺看到某個用戶,要想進入這個用戶的後臺, 我們肯定是點擊了這個用戶對應的按鈕之後,在後端去查詢這個用戶的賬號和密碼 然後提交到 用戶後臺登錄的接口來實現

快速登錄的按鈕配置(在用戶列表的控制器的grid方法下)

$grid->actions(
    function (Grid\Displayers\Actions $actions) {
    	//增加快速登錄的按鈕
        $actions->add(new QuickLogin());
    }
);

然後編寫這個QuickLogin
路徑在 app\Admin\Actions\User\QuickLogin.php
註釋寫在代碼裏!

<?php

namespace App\Admin\Actions\User;

use App\Admin\Models\UserModel;
use Encore\Admin\Actions\RowAction;

class QuickLogin extends RowAction
{
    public $name = "快捷登錄";


    public function actionScript()
    {
    	//獲取點擊時候傳過來的參數
        $userId = $this->row()->user_id;
        //獲取這個用戶信息
        $userInfo = UserModel::query()->where('user_id', $userId)->first();
        //組織參數 也就是賬號和密碼
        $params = [
            'username' => $userInfo->user_name,
            'password' => $userInfo->password,
        ];
        //提交到用戶後臺的登錄路由
        $url = env('USER_URL') . "/user/auth/login";
        //將參數進行加密
        $data = base64_encode(json_encode($params));
        //這裏是使用js去打開一個新的頁面實現登錄
        $url = $url . "?url=" . $data;
        return <<<EOF
window.open("$url","_blank");
$(".dropdown-menu").hide();
return false
EOF;
    }

}

關於用戶後臺的登錄處理

上述是組織參數到用戶後臺,但是用戶後臺的登錄功能是需要我們進行改寫的
首先 打開登錄的控制器
路徑在app\Admin\Controllers\AuthController.php
改寫以下方法:

/**
* Show the login page.
*
* @return Factory|Redirect|View
*/
public function getLogin()
{
   //判斷請求這個接口的時候 是否有一個參數是url
   $url = request()->input('url');
   //如果有 那就是快速登錄傳過來的
   if ($url) {
   //進行解密並轉成數組
       $loginData = json_decode(base64_decode($url), true);
       if (is_array($loginData)) {
       		//將這些參數 push到request()中
           request()->offsetSet('username', $loginData['username']);
           request()->offsetSet('password', $loginData['password']);
           request()->offsetSet('login_type', 'login_quick');
           $this->postLogin(request());
       }
   }

   if ($this->guard()->check()) {
       return redirect($this->redirectPath());
   }

   return view($this->loginView);
}



/**
* Handle a login request.
*
* @param Request $request
* @param  $csrf
*
* @return mixed
*/
public function postLogin(Request $request)
{
   $input = $request->all();
   //進行賦值
   $input['user_name'] = $input['username'];
   $this->loginValidator($input)->validate();
   //處理驗證
   $credentials = [
       'password'  => $request->input('password'),
       'user_name' => $request->input('username'),
   ];
   $remember = $request->get('remember', false);
   if ($this->guard()->attempt($credentials, $remember)) {
       return $this->sendLoginResponse($request);
   }

   return back()->withInput()->withErrors(
       [
           $this->username() => $this->getFailedLoginMessage(),
       ]
   );
}

之後我們來到Providers文件夾下:
app\Providers
我們新建一個服務提供者
(所謂的服務提供者是 Laravel 引導過程的核心。可以理解成""電腦從按下開機按鈕到完全進入桌面"這段時間系統乾的事)
也就是我們要去更改用戶後臺的登錄引導 加上我們的處理!
第一步新建我們的引導類文件NewEloquentUserProvider

<?php


namespace App\Providers;


use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;

class NewEloquentUserProvider extends EloquentUserProvider
{

    public function __construct(HasherContract $hasher, $model)
    {
        parent::__construct($hasher, $model);
    }

    /**
     * Validate a user against the given credentials.
     *
     * @param \Illuminate\Contracts\Auth\Authenticatable $user
     * @param array $credentials
     * @return bool
     */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        $plain = $credentials['password'];
        $loginType = request()->input('login_type', false);
        //如果是快速登錄的話 就判斷密碼是否相等 然後直接返回true
        switch ($loginType) {
            case 'login_quick':
                return $user->password == $plain ? true : false;
            default :
                return $this->hasher->check($plain, $user->getAuthPassword());
        }
    }

}

然後重寫註冊這個新的服務提供者
打開文件app\Providers\AuthServiceProvider.php
修改boot寫法:

public function boot()
{
    $this->registerPolicies();

    //
    Auth::provider('newEloquent', function($app, $config){
        return new NewEloquentUserProvider($app['hash'],$config['model']);
    });
}

最後一步
修改登錄的默認服務提供者
打開文件config\admin.php
修改driver

'providers' => [
            'admin' => [
                'driver' => 'newEloquent',
                'model'  => Encore\Admin\Auth\Database\Administrator::class,
            ],
        ],

至此,快速登錄的功能就完成了!

覺得有用的點個贊,加個關注吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章