如何在Laravel中分离用户会话和管理会话



如何在Laravel中分离用户会话和管理会话?

Laravel的多重授权能做到这一点吗?

是否有其他方法可以在不使用多重身份验证的情况下分离会话?我不想使用多重身份验证,因为它看起来很复杂。

但我想知道会话是否可以通过多重身份验证进行分离?下面的代码怎么样?

// in a user page
$request->session()->put('name', 1);
// in an admin page
var_dump($request->session()->get('name'));

将输出什么?1还是空?

一般来说,将用户会话和管理会话分离是web应用程序中的常见做法吗?

或者,您应该像这样通过在会话密钥中添加前缀来将用户会话与管理会话分开?

// in php
$_SESSION['user']['name'] = 1;
$_SESSION['admin']['name'] = 2;
unset($_SESSION['admin']);
// in Laravel
$request->session()->put('user.name', 1);
$request->session()->put('admin.name', 2);
$request->session()->forget('admin');

在Laravel的config/sessions.php中,我找不到将用户会话与管理会话分离的选项。会话配置文件似乎只提供了一个会话配置。

假设您只想为管理员保护某些视图。

以下是如何制作";Admin";,想出你想要的任何解决方案。例如,如果愿意,可以在用户表上创建一个额外的列。

首先在用户模型上创建一个名为isAdmin的方法

private const ADMIN_IDS = [
1,2,3,4
];
public function isAdmin()
{
return in_array($this->id, self::ADMIN_IDS);
}

然后创建一个中间件https://laravel.com/docs/8.x/middleware#defining-中间件

<?php
namespace AppHttpMiddleware;
use Closure;
class AdminMiddleware
{
public function handle($request, Closure $next)
{
if (auth()->user()->isAdmin()) {
return $next($request);
}
abort(401);
}
}

在App\Http\Kernel类中添加我们刚刚创建的"admin"中间件(见第二行(

protected $routeMiddleware = [
'auth' => AppHttpMiddlewareAuthenticate::class,
'admin' => AppHttpMiddlewareAdminMiddleware::class,
'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class,
'cache.headers' => IlluminateHttpMiddlewareSetCacheHeaders::class,
'can' => IlluminateAuthMiddlewareAuthorize::class,
'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
'signed' => IlluminateRoutingMiddlewareValidateSignature::class,
'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
'verified' => IlluminateAuthMiddlewareEnsureEmailIsVerified::class,
];

Route::get('/admin', function () {
//
})->middleware(['auth', 'admin']);

最新更新