在 Laravel 中使用多个守卫时,在注册/登录后设置默认守卫

Posted

技术标签:

【中文标题】在 Laravel 中使用多个守卫时,在注册/登录后设置默认守卫【英文标题】:Set Default Guard After Register/Login When Using Multiple Guards in Laravel 【发布时间】:2020-08-07 04:35:45 【问题描述】:

我正在开发一个 Laravel API 项目,其中用户的表有一个类型为 student 或 company 的列。

为了验证这两种类型的用户并限制对某些路由的访问,我设置了两个具有相同驱动程序(JWT)和提供程序(用户)的守卫。

       'company' => [
            'driver' => 'jwt',
            'provider' => 'users',
            'hash' => false,
        ],

        'student' => [
            'driver' => 'jwt',
            'provider' => 'users',
            'hash' => false,
        ],

在我的控制器的登录和注册方法中,我从用户选择其角色(学生或公司)的表单中访问用户类型的值。

public function register()

        $user= $this->create(request()->all());
        $token=auth(request('type'))->login($user);
        return $this->respondWithToken($token);


    

访问用户类型的目的是将该值传递给 auth() 方法,该方法又使用该值通过特定的守卫登录用户。

问题是:我必须在每个控制器方法中使用该请求(类型),只要需要身份验证并且需要使用 auth() 相关方法。例如 jwt respondwithtoken() 方法

protected function respondWithToken($token)
    
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth(request('type'))->factory()->getTTL() * 60
        ]);
    

我想要什么:我想要一种机制来在用户成功登录后动态设置保护,并且我应该能够使用 auth() 方法而不向它传递任何参数。

// shoulduseguarddynamically(request('type'));

P.S:还请验证当我有单表和多类型用户时以这种方式使用警卫是正确的方法吗?

【问题讨论】:

【参考方案1】:

首先,您的方法并不安全 - 只需篡改“类型”即可让您访问不应该去的地方。

你最好使用 Gates 而不是守卫, 您可以在此处的文档中查看它们:https://laravel.com/docs/7.x/authorization#gates

【讨论】:

+Christophe 使用门“代替”守卫或“与”守卫?因为我不这么认为大门是守卫的替代品。 Guards 用于身份验证,gates 用于授权。 由于您使用相同的模型和相同的身份验证 - 您实际上不需要使用不同的防护。使用 Gates 将能够控制您的用户是否被允许访问某个资源

以上是关于在 Laravel 中使用多个守卫时,在注册/登录后设置默认守卫的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中编写自定义登录功能

LARAVEL:一个身份验证守卫的多个驱动程序

如何在 laravel 刀片模板中检查当前的身份验证守卫及其来宾?

Laravel Blade @guest 指令用于多个守卫

多个 canActivate 守卫在第一次失败时全部运行

点击登录时,路由守卫和请求的关系图解