如何在中间件中使用会话来始终检查用户是不是登录

Posted

技术标签:

【中文标题】如何在中间件中使用会话来始终检查用户是不是登录【英文标题】:how to use session in middleware to always check that a user is logged in or not如何在中间件中使用会话来始终检查用户是否登录 【发布时间】:2017-01-27 21:11:28 【问题描述】:

我是 laravel 的新手。我正在尝试检查用户是登录还是访客。我创建了一个名为 (checkUserLogin) 的中间件,我的代码是:

namespace App\Http\Middleware;
use Auth;
use Closure;
use App\Http\Controllers\Controller;
use session;
class checkUserLogin

    public function handle($request, Closure $next)

    if (session()->get('email') != '')
        // redirected to dashboard.
    else
        // redirect to login page.
    
    return $next($request);
   
  `

在我的控制器和刀片模板中session()->get('email') 工作正常,如果我尝试打印session()->get('email'),我会收到登录但在中间件中的用户的电子邮件,然后会出现一个空白屏幕。

【问题讨论】:

【参考方案1】:

只需将下面的代码行替换为您的...希望可以工作...

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;

class checkUserLogin

    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $user;

    /**
     * Create a new middleware instance.
     *
     * @param  Guard  $user
     * @return void
     */
    public function __construct(Guard $user)
    
        $this->user = $user;
    

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    
        if ($this->user->guest())
        
            if ($request->ajax()) 
                            
                return response('Unauthorized.', 401);
            
            else
            
                return redirect()->guest('login');
            
                
        return $next($request);
    

【讨论】:

【参考方案2】:

您可以使用此代码。 验证::user();

这会自动检查

【讨论】:

【参考方案3】:

使用提供给您的工具

阅读文档并了解Retrieving The Authenticated User。您将看到您可以使用$request-&gt;user() 检索登录用户

查看包含的中间件RedirectIfAuthenticated 的代码。您将看到您可以检查用户是否使用Auth::guard($guard)-&gt;check() 登录

示例中间件代码

namespace App\Http\Middleware;

use Auth;
use Closure;

class checkUserLogin

    public function handle($request, Closure $next)
    
        if ( $request->user() )
            // user is logged in
         else 
            // user is not logged in
        

        return $next($request);
    

一些想法

如果您的目标是让任何访问者都能看到路线,但要向已登录的访问者显示与您向访客显示的内容不同的部分,那么在控制器中很容易做到这一点。例如,当用户未登录时,通常会显示“登录”链接。当用户登录时,通常会显示用户帐户菜单。

【讨论】:

是的,我明白你的意思,但我想知道为什么我不能在中间件中使用会话。是否有任何会话范围问题或其他问题。 @sandeep 您的问题被表述为“我正在尝试检查用户是登录还是访客。” @sandeep 在中间件中使用session() 没有范围问题。如果设置了该值,则它是可访问的。你有什么理由相信 session 设置了email 是的,我在控制器中设置会话,当我在控制器或刀片中打印 session()->get('email') 时。我收到了我在表单中输入的电子邮件,但是当我打印时中间件中的同一行我什么也没得到。 我正在使用github.com/Edujugon/laradoo/?utm_source=learninglaravel.net 包,我想在中间件中使用会话...我该如何使用它?

以上是关于如何在中间件中使用会话来始终检查用户是不是登录的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是不是在 php 中登录?

如何检查用户是不是在 php 中登录?

检查用户是不是使用会话而不是数据库查询登录

检查会话是不是存在 JSF

如何检查用户是不是已经使用 Apache Shiro 登录?

Firebase - 始终检查用户是不是登录的最佳方式?