【问题标题】:How do I use the method attempt() - Laravel 7如何使用方法尝试() - Laravel 7
【发布时间】:2020-11-07 07:03:43
【问题描述】:

我试图弄清楚Auth::attempt() 的工作原理。它不会返回任何错误,但它也不起作用,只是返回 false。

我尝试定义表名,我尝试添加保护,但我不确定它是如何工作的。

根据 Laravel 文档,如果我没记错的话,我应该为每个身份验证添加一个守卫(我需要使用不同的表进行身份验证)。

https://laravel.com/docs/7.x/authentication#introduction

这就是我定义新守卫的方式:(我不确定它是否与我的问题有关)

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'web' => [
        'driver' => 'session',
        'provider' => 'guest',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

我的问题是,如何使用Auth::attempt() 对从我想要的表中检索数据的用户进行身份验证,还是应该使用我自己的方法?

我是 Laravel 新手,所以有点困惑。

【问题讨论】:

    标签: laravel authentication


    【解决方案1】:

    一个明确的错误是,你不能有两个同名的守卫。

    下一个错误可能是,您没有添加提供程序'guest',但这只能猜测。

    我会这样处理:

    1. 为您的第二个网络提供商提供另一个名称。
    2. 确保您的第一个 Web auth 防护再次按预期工作
    3. 开始实施第二个网络身份验证保护

    例如,您的 auth.php 可能如下所示:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'guest' => [
            'driver' => 'session',
            'provider' => 'guest',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
        'guest' => [
            'driver' => 'eloquent',
            'model' => App\Models\Guest::class,
        ],
    ]
    

    当然,您还必须定义模型 Guest

    然后你可以这样做:

    Auth::guard('web')->attempt($credentials)
    // or
    Auth::guard('guest')->attempt($credentials)
    

    需要考虑的事情

    有时您认为您需要不同的表进行身份验证,但实际上使用一个基本的用户表和 auth guard 然后使用其他表将用户连接到例如,进一步的数据和角色。

    【讨论】:

    • 感谢您的解释和建议。您的解决方案有效,但现在它返回 false 并且我确定字段密码具有正确的哈希值。 attempt 方法从哪里获取数据?从模型Guest ?
    • 如果我将 `Auth::guard('guest')->attempt($credentials)` 更改为 `Auth::guard('guestt')->attempt($credentials)` 它给出我一个错误,这意味着警卫正在工作,但似乎没有进行身份验证。我检查了电子邮件和密码。
    • 我建议您阅读以下文档和解决方案,并尝试找出您的错误真正发生的位置。例如,我认为您必须在新模型中包含 Authenticatable 特征,但正如您所见,目前涉及的猜测工作太多。至少对我来说;)
    • 可能首先将提供的用户模型复制到来宾模型,然后只更改类名。确保您对应的桌子称为客人。
    • 您可能需要查看您在命名空间下和 auth.php 中放置的内容,否则不需要。如果我有时间并发布一个链接来说明如何做,我想我今晚会尝试自己实现这一点。
    【解决方案2】:

    在 Laravel 中,默认的 web 保护用于身份验证。

    config/auth.php
    
    
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
     ],
    
     /** Define driver and respective provider, Supported: session, token **/ 
    
     'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users', 
        ],
    
        'admin' => [
            'driver' => 'session',  
            'provider' => 'admin',
        ],
        //..
     ],
    
     /** Defines how the users are retrieved out of your database **/
    
    'providers' => [
       'users' => [
           'driver' => 'eloquent',
           'model' => App\User::class,
        ],
    
        'admin' => [  
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
        //...
    ]
    

    默认情况下,laravel 使用以下模型进行身份验证。此处无需指定守卫名称。

    App\User
    
    $credentials = $request->only('email', 'password');
    
    Auth::attempt($credentials)
    

    您也可以在 Laravel 中创建自定义守卫,例如创建管理员 guard 和相应的身份验证模型

    App\Admin
    
    $credentials = $request->only('email', 'password');
    
    // specify guard name for custom guard
    
    Auth::guard('admin')->attempt($credentials)
    

    https://laravel.com/docs/7.x/authentication#adding-custom-guards

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2013-12-02
    • 1970-01-01
    • 2019-02-04
    • 2020-03-11
    相关资源
    最近更新 更多