laravel_admin 单一登录的简单实现
一、修改vendor/encore/laravel-admin/src/Controllers/AuthController.php中postLogin方法
if ($this->guard()->attempt($credentials, $remember)) {
$res = $this->sendLoginResponse($request);
//登录成功 记录token
$this->sendCookieToken($this->guard()->user(), $request);
return $res;
}
二、添加方法sendCookieToken
/*
* 制作token,用于单用户登录验证
*/
public function sendCookieToken($member, Request $request) {
$time = time();
$sinleToken = md5($request->getClientIp().$member->id.$time);
Cache::put($member->id, $time, 300);
\Cache::put('check_code'.$member->id, null, 300);
$request->session()->put('SINGLETOKEN', $sinleToken);
}
三、使用中间件验证是否重复登录
1、admin.php 中 route数组 middleware 添加中间件single_m
'route' => [
'prefix' => env('ADMIN_ROUTE_PREFIX', 'admin'),
'namespace' => 'App\\Admin\\Controllers',
'middleware' => ['web', 'admin', 'single_m'],
}
2、新建中间件 app/Http/Middleware/SingleAdminLogin.php
<?php
namespace App\Http\Middleware;
use Closure;
use Dcat\Admin\Admin;
use Illuminate\Support\Facades\Cache;
class SingleAdminLogin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//判断是否重复登录
if ($this->isRelogin($request)) {
//重复登录 退出登录状态
Admin::guard()->logout();
return redirect('/admin');
}
return $next($request);
}
/**
* 比较token,判断是否需要重新登录
*/
protected function isRelogin($request)
{
$member = $request->user('admin');
if ($member) {
// 获取 session 中的 token
$singletoken = $request->session()->get('SINGLETOKEN');
if ($singletoken) {
// 获取 time
$redisTime = Cache::get($member->id);
// 重新获取加密参数加密
$ip = $request->getClientIp();
$secret = md5($ip . $member->id . $redisTime);
if ($singletoken !== $secret) {
return true;
}
return false;
}
}
return false;
}
}
3、app/Http/Kernel.php $routeMiddleware
protected $routeMiddleware = [
'single_m' => \App\Http\Middleware\SingleAdminLogin::class,
];
转载博客:blog.csdn.net/aawuwuwuxx/article/d...
本作品采用《CC 协议》,转载必须注明作者和本文链接
不建议去修改 vendor 里面的代码,直接在admin.php 中修改AuthController 的类,在自己的项目中继承并修改
@liaosp 是这样的。