laravel 5.4 中的两种不同的身份验证模型

Two different models for authentication in laravel 5.4

假设我有两个不同的模型和表,分别命名为 usercompany

如您所知,laravel 使用 User 模型来管理身份验证。但是因为我有两个不同的模型,所以我希望可以分别管理它们。

我正在使用 laravel 5.4,但我不知道该怎么做。

如果你在谈论多重身份验证系统,那么你必须创建多个 guards 来实现。

同样的问题有很好的答案。

它在 Laravel 5.2 上,但在 Laravel 5.4 上可以轻松实现。

  1. 创建一个模型 App\Company 扩展 Authenticatable Class。此模型将用作用户模型,它将 company 守卫(在下一步中)

    namespace App;
    
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class Company extends Authenticatable
    {
    
        use Notifiable;
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'name', 'email', 'password',
        ];
    
        /**
         * The attributes that should be hidden for arrays.
         *
         * @var array
         */
        protected $hidden = [
            'password', 'remember_token',
        ];
    
    }
    
  2. 为模型App\Company创建守卫和提供者。

    // Authenticating guards and providers
    
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
        'company' => [
            'driver' => 'session',
            'provider' => 'company',
        ],
    ],
    
    // Providers 
    
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'company' => [
            'driver' => 'eloquent',
            'model' => App\Company::class,
        ]
    ],
    

现在可以根据不同的门卫查找用户

$user = Auth::guard('company')->user();
// Or...
$user = auth()->guard('company')->user();
dd($user);
  1. 现在为公司 App\Http\Controllers\Auth\CompanyLoginController 创建 Auth 控制器,与 Auth\LoginController 相同。 指定 $redirectToguard

    //Auth\ComapnyLoginController.php
    
    protected $redirectTo = '/comapany';
    protected $guard = 'comapany';
    
    public function showLoginForm()
    {
        if (view()->exists('auth.authenticate')) {
            return view('auth.authenticate');
        }
    
        return view('comapany.auth.login');
    }
    

现在为用户创建登录表单 - company.auth.login视图与用户的登录表单相同。

  1. 现在创建路线

    //Login Routes...
    Route::group(['prefix'=>'company', 'middleware'=>'company'], function(){
        Route::get('/login','Auth\CompanyLoginController@showLoginForm');
        Route::post('/login','Auth\CompanyLoginController@login');
        // ...
        // rest of the company dashboard and other links
        // ...
        Route::get('/logout','Auth\CompanyLoginController@logout');
    });
    
  2. 为公司创建一个中间件

    class RedirectIfNotCompany
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @param  string|null  $guard
         * @return mixed
         */
        public function handle($request, Closure $next, $guard = 'company')
        {
            if (!Auth::guard($guard)->check()) {
                return redirect('/');
            }
    
            return $next($request);
        }
    }
    

    并注册到kernal.php

    protected $routeMiddleware = [
        'company' => \App\Http\Middleware\RedirectIfNotCompany::class,
    ];
    

这就是您所需要的。 以guard

的名义访问用户
Auth::guard('company')->user()