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,
            ],
        ],

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

觉得有用的点个赞,加个关注吧!

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