Laravel 7 手动身份验证会话问题

Posted

技术标签:

【中文标题】Laravel 7 手动身份验证会话问题【英文标题】:Laravel 7 manual authentication session issue 【发布时间】:2020-09-01 17:42:49 【问题描述】:

TL;DR:在成功登录并重定向到/home后,我被Controller的中间件($this->middleware('auth');)踢回/login

我有一个php-apache docker 开发环境。最后,我能够将 Laravel 7 用于新服务,因此我设置了它,获取了框架并开始使用它。我不能使用 Laravel 的散列算法,因为我有一个自定义方法,我知道可以与 Auth::attempt() 方法一起使用 manual authentication。

都设置这个点

public function login(Request $r)

    $data = $r->validate([
        'username' => 'required|string',
        '_pswrd'   => 'required|string',
    ]);

    $credentials = [
        'login'    => $data['username'],
        'password' => $data['_pswrd'],
        'status'   => 'A',
    ];

    try 
        if (Auth::guard()->attempt($credentials, $r->has('remember'))) 
            // Auth::user() is found and valid so redirect...
            return $r->wantsJson()
                ? new Response('', 204)
                : redirect()->intended('/');
        

        return back()->with('errors', new MessageBag([ 'auth.failed' ]));

     catch (Exception $e) 
        Log::warning($e);

        return back()->with('errors', new MessageBag([ 'auth.unknown' ]));
    

但是,那我去home路线

class HomeController extends Controller

    public function __construct()
    
        // \Illuminate\Support\Facades\Auth::user() === null
        $this->middleware('auth');
    

    public function index()
    
        return view('home');
    

为什么 HomeController 中的 Auth::user() 为空? 为什么我的会话丢失了? 我是否缺少 Apache 或 laravel 的 conf/ 文件夹中的某些配置?

【问题讨论】:

【参考方案1】:

守卫叫什么名字?是为了web 守卫吗? 因此,尝试填写guard('web') 或直接删除它,直接Auth::attempt([])

【讨论】:

【参考方案2】:

这是一种没有检查明显的问题。 Laravel 改变了(很多)用户的模型,我想稍后再看。必须修复 primary_keykeyType 属性才能使中间件正常工作。

我会留下这个答案,因为我在这个问题上花了很多时间,总是认为它与身份验证或会话配置有关,但实际上并非如此。

【讨论】:

以上是关于Laravel 7 手动身份验证会话问题的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.2 中使用默认身份验证路由对用户进行身份验证后设置会话数据

Laravel 4.1 身份验证会话数据不会跨请求持久化

与 PHP 共享 Laravel 身份验证/会话

来自 laravel 会话登录的经过身份验证的 api 调用。可能吗?

Laravel 5.3记住我身份验证问题

Laravel 5.3记住我身份验证问题