[英]Can't authenticate against multiple models in Laravel
我正在嘗試為我的應用程序中的超級管理員和用戶(單獨的表)設置身份驗證,但是它的行為不符合預期。 對User
模型的身份驗證可以正常工作,但對Superadmin
模型則不能。 我的模型如下:
User.php:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'username', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
Superadmin.php:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Superadmin extends Authenticatable
{
use Notifiable;
protected $guard = 'superadmin';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'username', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
我的config / auth.php
<?php
return [
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'superadmin' => [
'driver' => 'session',
'provider' => 'superadmins',
],
'superadmin-api' => [
'driver' => 'token',
'provider' => 'superadmins'
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'superadmins' => [
'driver' => 'eloquent',
'model' => App\Superadmin::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
'superadmins' => [
'provider' => 'superadmins',
'table' => 'password_resets',
'expire' => 15,
],
],
];
對我來說似乎正確,但顯然不正確,因為在為超級管理員用戶輸入正確的憑據后發生以下情況:
任何幫助將非常感激!
如果你走的話
vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Auth\\AuthenticatesUsers.php
您將看到一個名為attemptLogin
的方法
其中有
/**
* Attempt to log the user into the application.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function attemptLogin(Request $request)
{
return $this->guard()->attempt(
$this->credentials($request), $request->filled('remember')
);
}
現在,如果您使用guard
方法,它將使用
/**
* Get the guard to be used during authentication.
*
* @return \Illuminate\Contracts\Auth\StatefulGuard
*/
protected function guard()
{
return Auth::guard();
}
現在,如果您進一步研究
vendor\\laravel\\framework\\src\\Illuminate\\Auth\\AuthManager.php
您將看到“后衛方法”期望使用$name
/**
* Attempt to get the guard from the local cache.
*
* @param string $name
* @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard
*/
public function guard($name = null)
{
$name = $name ?: $this->getDefaultDriver();
return $this->guards[$name] ?? $this->guards[$name] = $this->resolve($name);
}
現在,查看getDefaultDriver
方法,該方法從auth配置文件獲取默認值:
/**
* Get the default authentication driver name.
*
* @return string
*/
public function getDefaultDriver()
{
return $this->app['config']['auth.defaults.guard'];
}
在您的auth.php中添加:
'login' => [
'guard' => [
'web',
]
],
因此,在您的logincontroller.php
,您可以覆蓋Guard方法以使用特定的Guard:
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Modules\Core\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
/**
* Attempt to log the user into the application.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function attemptLogin(Request $request)
{
foreach(config('auth.login.guard') as $guard) {
return $this->guard($guard)->attempt(
$this->credentials($request), $request->filled('remember')
);
}
return false;
}
/**
* Send the response after the user was authenticated.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
protected function sendLoginResponse(Request $request)
{
$request->session()->regenerate();
$this->clearLoginAttempts($request);
foreach(config('auth.login.guard') as $guard) {
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath());
}
return false;
}
/**
* Log the user out of the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function logout(Request $request)
{
foreach(config('auth.login.guard') as $guard) {
$this->guard($guard)->logout();
}
$request->session()->invalidate();
return redirect('/');
}
/**
* Get the guard to be used during authentication.
*
* @return \Illuminate\Contracts\Auth\StatefulGuard
*/
protected function guard($name = null)
{
return Auth::guard($name);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.