私の知る限り Auth::attempt
はusers
テーブルのユーザーを認証するために使用されますが、managers
テーブルの別のユーザーとadmins
テーブルの管理者を認証したいです。 laravel-multiauth
プラグインはすでに存在します。しかし、複数のテーブルからユーザーを認証するための独自のAuthServiceProvider
を作成できますか?
最初にIlluminate\Foundation\Auth
のように管理者認証を作成します
<?php
namespace Illuminate\Foundation\Auth;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
class Admin extends Model implements
AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;
}
次に、Authenticatable
管理モデルを拡張して管理モデルを作成します:-
<?php
namespace App;
use Illuminate\Foundation\Auth\Admin as Authenticatable;
class Admin extends Authenticatable
{
/**
* 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',
];
}
その後、以下のようにconfig/auth.php
を変更する必要があります。providers array
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
およびguards配列に追加します。
'user' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
ser tableから認証するようになりました
if (Auth::guard('user')->attempt(['email' => $email, 'password' => $password])) {
$details = Auth::guard('user')->user();
$user = $details['original'];
return $user;
} else {
return 'auth fail';
}
そしてAdminテーブルから認証する
if (Auth::guard('admin')->attempt(['email' => $email, 'password' => $password])) {
$details = Auth::guard('admin')->user();
$user = $details['original'];
return $user;
} else {
return 'auth fail';
}
それぞれ異なるプロバイダーを持つ複数の認証ガードをセットアップできます。プロバイダーは、使用するテーブルまたはモデルを定義します。
config/auth.php
次のようにproviders
を設定し、それらの各プロバイダーに対応するguards
も設定します。
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'managers' => [
'driver' => 'eloquent',
'model' => App\Manager::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
]
]
その後、次のように認証できます。
Auth::attempt($credentials) // use default guard for simple users
Auth::guard('manager')->attempt($credentials)
Auth::guard('admin')->attempt($credentials)
ドキュメントを確認してください こちら 。
必要に応じて私のアイデアを試してください。異なるtable
が異なるusers
を持っていると期待しています。他のテーブルに同じuser
がある場合は機能しないためです。
if(Auth::user(attempt(...))
elseif(Auth::manager(attempt(...))
elseif(Auth::admins(attempt(...)))
注:ここでの優先度テーブルはusers
です。ユーザーがそのテーブルに存在しない場合は、managers
テーブルを試し、まだ存在しない場合はチェックしますadmins
テーブル、それ以外の場合(else
を使用)はメッセージエラーを返します。
その他のオプション:
他のオプションは、このパッケージを使用することですsarav/laravel-multiauth
。このスレッドをフォローできます。 詳細については、Laravel 5 の複数のテーブルで認証を使用する方法。
その他のリファレンス:
https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1
Managersテーブルとadminsテーブルのモデルを作成します。このモデルは_Illuminate\Foundation\Auth\User
_を拡張する必要があります
_config/auth.php
_で、
プロバイダー配列に追加します。
_'managers' => [
'driver' => 'eloquent',
'model' => App\Manager::class,
],
_
ガード配列に追加します。
_'web_manager' => [
'driver' => 'session',
'provider' => 'managers',
],
_
それから。 LoginController
(_php artisan make:auth
_を使用してマネージャー用に作成)で、特性_Illuminate\Foundation\Auth\AuthenticatesUsers
_を使用し、ガードおよびリダイレクトプロパティをオーバーライドします。
_protected $redirectTo = 'redirect_path_after_manager_login';
protected function guard()
{
return Auth::guard('web_manager');
}
_
マネージャーモデルが認証され、認証されたマネージャーのオブジェクトAuth::guard('web_manager')->user();
を取得できます