很常见的功能 就是我们登陆后台之后 有一个用户列表
每个用户有一个一个快速登陆的按钮,点击之后直接跳转到用户自己的后台
因为在一套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
注释写在代码里!
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
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,
],
],
至此,快速登录的功能就完成了!
觉得有用的点个赞,加个关注吧!