我想在我的laravel项目中创建一个中间件来检查登录到我的网站的用户类型。我的想法是检查用户是否登录到中间件,然后将会话变量设置为某个值。
这是中间件:
CheckIfLoggedin.php
use Closure;
use Auth;
class CheckIfLoggedin
{
public function handle($request, Closure $next)
{
if (Auth::check()) {
$request->session()->put('loggedin', 'admin');
}
return $next($request);
}
}
我已将其注册为全局中间件,如文档中所述,将此行添加到Kernel.php中:
protected $middleware = [
// ...
\App\Http\Middleware\CheckIfLoggedin::class,
];
我在我的刀片模板中检查此会话变量的值,如下所示:
@if(session('loggedin'))
<!-- some html code -->
@endif
我知道我也可以使用它进行登录验证:
@auth
<!-- some html code -->
@endauth
但是使用这个会话变量的原因是我会有不同类型的成员(比如member
或admin
),我稍后会将登录类型分配给该会话变量,它应该在刀片模板中像这样工作:
@if(session('loggedin')=='member')
<!-- some html code that only members can see -->
@elseif(session('loggedin')=='admin')
<!-- some html code that only admins can see -->
@endif
关于为什么这个中间件没有像我预期的那样工作的任何想法?请注意,我对Laravel来说相当新......
谢谢!
您需要先启动一个会话才能使用它,如果您阅读了库存kernel.php
,您将看到该会话仅在web
组中启动(通过\Illuminate\Session\Middleware\StartSession::class
),因此您需要在它下面添加自己的中间件。
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
注意:我要做的是利用policies and gates和自定义守卫,但不是这类工作的会话。