web-dev-qa-db-ja.com

Laravel 5.2例を使ったマルチ認証は誰でも説明できます

ユーザーadminuserテーブルとadminテーブルをそれぞれ認証しようとしています。 laravelから提供されているUserモデルをそのまま使用し、Admin.に同じものを作成しました。auth.php.にガードキーとプロバイダーキーを追加しました。

警備員

'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

プロバイダ

'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],

ルート

Route::group(['middleware' => ['web']], function () {
    // Login Routes.   
    Route::get('/admin/login','AdminAuth\[email protected]');
    Route::post('/admin/login','AdminAuth\[email protected]');
    Route::get('/admin/logout','AdminAuth\[email protected]');

    // Registration Routes.
    Route::get('admin/register', 'AdminAuth\[email protected]');
    Route::post('admin/register', 'AdminAuth\[email protected]');

    Route::get('/admin', '[email protected]');
});

LaravelのデフォルトのAuthController.phpPasswordController.phpファイルが存在するAuthAdminというディレクトリを作成しました。 (ネームスペースは適宜変更)

まず第一に、Laravelの文書では、このように認証しながらカスタムガードを指定する方法について説明しましたが、これは機能しません。
enter image description here

Laravelの文書で言及されている、あまりにもうまくいかないガードを使うための別の方法があります。

enter image description here

誰かが問題を解決し、私が間違っていれば私を直すことができれば有益でしょう。

161
imrealashu

たくさんの掘り下げとたくさんの質問と答えの後、私はついに2つのテーブルでLaravel 5.2 Multi Authを働かせることができたので、私は自分自身の質問の答えを書きます。

Larvel 5.2でMulti Authを実装する方法

上記のように。 2つのテーブルadminname__とusersname__

Laravel 5.2には新しいartisanname__コマンドがあります。

php artisan make:auth

routename__テーブルの基本ログイン/レジスタviewname__、controllername__およびusername__を生成します。

簡単にするために、adminname__表をusersname__表として作成します。

管理者用コントローラ
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(注:これらのファイルをapp/Http/Controllers/Auth/AuthControllerからここにコピーしたところです)

config/auth.php

//Authenticating guards
'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

//User Providers
'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],  

//Resetting Password  
'passwords' => [
    'clients' => [
        'provider' => 'client',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],  

route.php

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\[email protected]');
    Route::post('/admin/login','AdminAuth\[email protected]');
    Route::get('/admin/logout','AdminAuth\[email protected]');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\[email protected]');
    Route::post('admin/register', 'AdminAuth\[email protected]');

    Route::get('/admin', '[email protected]');

});  

AdminAuth/AuthController.php

2つのメソッドを追加して$redirectTo$guardを指定

protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
{
    if (view()->exists('auth.authenticate')) {
        return view('auth.authenticate');
    }

    return view('admin.auth.login');
}
public function showRegistrationForm()
{
    return view('admin.auth.register');
}  

管理者用の別のログインフォームを開くのに役立ちます。

adminNAMEのミドルウェアを作成する_

class RedirectIfNotAdmin
{
/**
 * 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 = 'admin')
{
    if (!Auth::guard($guard)->check()) {
        return redirect('/');
    }

    return $next($request);
}

}

ミドルウェアをkernel.phpに登録する

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

このミドルウェアをAdminControllername__で使用する

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    public function __construct(){
        $this->middleware('admin');
   }
public function index(){
        return view('admin.dashboard');
    }
}

それが機能するようにするためにも認証された管理者の使用のJSONを取得するために必要なすべてです
Auth::guard('admin')->user()

編集 - 1
認証されたユーザーに直接アクセスすることができます
Auth::user()あなたが2つの認証テーブルを持っているなら、あなたはそれを使わなければなりません

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

ログアウト用

Auth::guard('guard_name')->user()->logout()

認証ユーザーjson用

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

編集2

これでLaravel 5.2マルチ認証実装プロジェクト http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/をダウンロードできます。

194
imrealashu

これが誰かに役立つ場合、そしてこれは私がミドルウェアを理解していないことが原因であるかもしれません、これがうまくいくようにするために私がしなければならなかったことはここにあります….

route.php

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => '[email protected]'
]);

これはwebミドルウェアグループにあります。これ以前は、別のadminミドルウェアグループ、さらにはauth:adminグループに入れてみましたが、これはうまくいきませんでした。ルート自体でミドルウェアをadminとして指定した場合にのみうまくいきました。これがなぜなのか私にはわかりませんが、私がしたように他の人が髪を抜くのを防ぐことができればと思います。

2
Sworrub Wehttam

5.6レベルではとても簡単です。 config/auth.phpに行き、この行をproviders配列に追加するだけです。

'admins' => [
   'driver' => 'database',
   'table' => 'admin_table'
]

ドライバにdatabaseではなくeloquentを使用したことに注意してください。

これをguards配列に追加します。

'admin_guard' => [
   'driver' => 'session',
   'provider' => 'admins'
]

これで終わりです! adminsテーブルを操作するときにこれを使用します。

Auth::guard('admin_guard')->User();

乾杯。

0
Sky