【问题标题】:Laravel 5.3 get attempt true but Auth::User return null?Laravel 5.3 尝试为真,但 Auth::User 返回 null?
【发布时间】:2017-04-11 20:20:12
【问题描述】:

正如标题所说,在VendorControllerpostLogin方法中dd(Auth::user())得到的值为null,但是$attempt得到的结果true,却无法得到已经尝试过的数据。

我的routes/web.php

Route::group(['prefix' => 'vendor','as' => 'Vendor.'], function () {
        Route::get('login', 'VendorController@login')->name('Login');
        Route::post('login', 'VendorController@postLogin')->name('Post.Login');
});

我的VendorController

  public function postLogin(Request $request)
  {
    $attempt = Auth::guard('vendor')->attempt([
      'acctId'   => $request->acctId,
      'password' => $request->password
    ]);

    if($attempt){
      dd(Auth::user());
    }
  }

我的Vendor 模特

namespace ACME\Entities;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Auth\Authenticatable as AuthenticableTrait;
class Vendor extends Model implements Authenticatable
{
    use AuthenticableTrait;

    protected $table = 'vendor';
    protected $primaryKey = 'id';
    public $timestamps = true;
    protected $fillable = [
        'acctId',
        'password',
        'active',
        'remark'
    ];
    protected $guarded = ['password'];
}

我的config/auth.php

return [

    'defaults' => [
        // 'guard' => 'web',
        // 'passwords' => 'users',
        'guard' => 'user',
        'passwords' => 'users',
    ],

    'guards' => [
        // 'web' => [
        //     'driver' => 'session',
        //     'provider' => 'users',
        // ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],

        'user' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
        'vendor' => [
            'driver' => 'session',
            'provider' => 'vendors',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => ACME\Entities\User::class,
        ],
        'admins' => [
            'driver' => 'eloquent',
            'model' => ACME\Entities\Admin::class,
        ],
        'vendors' => [
            'driver' => 'eloquent',
            'model' => ACME\Entities\Vendor::class,
        ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'email' => 'auth.emails.password',
            'table' => 'user',
            'expire' => 60,
        ],
        'admins' => [
            'provider' => 'admins',
            'email' => 'auth.emails.password',
            'table' => 'admin',
            'expire' => 60,
        ],
        'vendors' => [
            'provider' => 'vendors',
            'email' => 'auth.emails.password',
            'table' => 'vendor',
            'expire' => 60,
        ],
    ],

];

【问题讨论】:

    标签: php laravel authentication laravel-5.3 guard


    【解决方案1】:

    因为您使用的是自定义驱动程序并且您没有使用Auth::shouldUse() 来定义该方法需要使用哪个驱动程序,所以您需要像这样调用经过身份验证的用户:

    Auth::guard('vendor')->user()
    

    在另一种解决方案中,您可以使用Auth::shouldUse() 方法。

    public function postLogin(Request $request)
    {
        Auth::shouldUse('vendor');
    
        if(! $attempt = Auth::attempt([
          'acctId'   => $request->acctId,
          'password' => $request->password
        ])){
          //handle error if there is not login
        }
    
        dd(Auth::user());
    }
    

    通过这样做,您将驱动程序设置为使用供应商。

    【讨论】:

    • 这在使用 Laravel 多重身份验证和非默认保护时非常重要。似乎很奇怪,它允许保护特定的身份验证,但实际上并没有在登录后将用户设置在身份验证实例上(这可能是一个很好的理由,只是超出了我目前的理解水平)。我花了一段时间才找到这个。谢谢!
    猜你喜欢
    • 2017-03-17
    • 2023-02-04
    • 1970-01-01
    • 2019-09-20
    • 2016-05-13
    • 2021-01-02
    • 2020-08-14
    • 2017-06-29
    • 2016-05-11
    相关资源
    最近更新 更多