需求
很常見的功能 就是我們登陸後臺之後 有一個用戶列表
每個用戶有一個一個快速登陸的按鈕,點擊之後直接跳轉到用戶自己的後臺
項目的設計
因爲在一套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,
],
],
至此,快速登錄的功能就完成了!
覺得有用的點個贊,加個關注吧!