后台管理之认证二
上篇文章写的是用JWT做的认证,对于不是前后端分离的情况,其实是不合适的,这次试用基于cookie的认证实现后台管理认证。
第一步:打开/routes/web.php文件,在$router->group()参数中,增加一个:'middleware' => 'auth.admin',middleware的值你可以自己命名,我这里叫做auth.admin。
第二步:打开/bootstrap/app.php文件,增加路由中间件
$app->routeMiddleware([
'auth.admin' => App\Http\Middleware\AdminAuthenticate::class,
]);
注意,auth.admin一定要和路由中的auth.admin对应上,不然不会起作用的
为了用户的信息在cookie中是安全的,我们使用加解密功能,这个功能需要手动打开,在这个app.php文件中,增加代码
$app->register(Illuminate\Encryption\EncryptionServiceProvider::class);
加了它还不行,因为配置文件还没有做,必须设置一个key,你就随机生成一个32位长度的key,然后把可以放到.env文件中的APP_KEY后面
然后在app.php文件中,引入/config/app.php文件
$app->configure('app'); // 引入/config/app.php文件中的配置信息
第三步:在/app/Http/Middleware/目录下,新建文件AdminAuthenticate.php文件,内容如下
<?php
namespace App\Http\Middleware;
use App\Admin;
use Closure;
use Illuminate\Support\Facades\Crypt;
class AdminAuthenticate
{
public function handle($request, Closure $next, $guard = 'admin')
{
try{
// 在登录的时候,把用户的ID进行加密后放到cookie中。这里是验证,取出coolie解密。如果解密失败,会抛出异常
$adminId = Crypt::decrypt($_COOKIE['user_id']);
$adminInfo = \App\Models\Admin::find($adminId);
// 检查用户是否存在
if(empty($adminInfo->id)){
Throw new \Exception('账号错误');
}
// 检查启用状态
if($adminInfo->state != 1){
Throw new \Exception('请联系管理员');
}
}catch (\Exception$e){
// 出错后,可以跳转到错误页面,也可直接返回错误信息
$arrayResult['code'] = 401;
$arrayResult['message'] = $e->getMessage();
$arrayResult['data'] = [];
return response()->json($arrayResult, 401)->setEncodingOptions(JSON_UNESCAPED_UNICODE);
}
// $next不能少
return $next($request);
}
}
第四步:在用户登录的时候
// 取出用户的ID,对ID进行加密,然后存到coolkie中
setcookie('user_id',Crypt::encrypt($admin->id), time() + 36000);
结束。