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


171

ユーザー管理フォームのuserテーブルとadminテーブルをそれぞれ認証しようとしています。私はUserlaravelが提供するモデルをそのまま使用して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\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes.
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');
});

AuthAdminLaravelのデフォルトAuthController.phpPasswordController.phpファイルが存在するというディレクトリを作成しました。(それに応じて変更された名前空間)

まず第一に、Laravelのドキュメントでは、このように認証されているときにカスタムガードを指定する方法が機能していないと述べています。
ここに画像の説明を入力してください

Laravelのドキュメントで言及されている、動作していないガードを使用する別の方法があります。

ここに画像の説明を入力してください

誰かが問題を解決し、私が間違っている場合は私を修正してくれると有益です。


Laravelはバージョン5.2.6のバグを修正しました。protected $guard = 'guard_name'今すぐ使用できます。
imrealashu

Laravelでは、利用可能な多くの管理パネルジェネレーターパッケージがあります。私はVoyager Adminを好みます。簡単で簡単にインストールできます。それはあなたのコードのトンを節約するかもしれません。あなたはそれがどのように機能するかを理解する必要があるだけです。車輪を再発明しないでください。Voyager-The Missing Laravel Admin Gentelella bootstrap admin tempalteを備えたLaravelアプリケーション。
サティッシュR 2017

回答:


201

たくさんの掘り下げと多くの質問と回答の後、私はようやく2つのテーブルでLaravel 5.2マルチ認証を処理することができたので、私は自分の質問の回答を書いています。

Larvel 5.2でマルチ認証を実装する方法

上記のように。2つのテーブルadminusers

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

php artisan make:auth

それは基本的なログイン/レジスタを生成しますrouteviewcontrollerのためのuserテーブル。

簡単にするために、adminテーブルとしてusersテーブルを作成します。

管理者用コントローラー
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\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

});  

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');
}  

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

ミドルウェアの作成 admin

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,
];

AdminController たとえば、このミドルウェアを使用します

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 Multiauth実装プロジェクトをダウンロードできるようになりましたhttp://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/


多くの人に感謝します、これは私が探していたものでした、それは少しの修正でうまくいきました。Qに+ 1、Ansに+1に感謝します。どうもありがとう..
rummykhan

@imrealashu、私はあなたの答えに従ってプロジェクトを作成したので。しかし、同じ名前の複数のクラスのエラーを生成します。それではどうですか?管理者認証のクラス名を変更した場合、どこで変更を行う必要がありますか?
Akshay Vaghasiya 2016

1
管理者ガードのために「パスワードをリセット」する方法について説明してもらえますか?
Shoaib Rehan 2016年

1
素晴らしい説明をありがとうございました。ミドルウェアゲストを使用するには、RedirectIfAuthenticated.phpファイルを次の行に変更します。オリジナル: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } 変更後: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza

1
@Jeffzは、ドキュメントが不適切で、マルチ認証に関する実用的な例がないためです。適切なドキュメントがあり、この5.3アップデートの新しいクールな機能があります。
imrealashu

2

これが誰かを助ける場合、これはミドルウェアについての私の理解の欠如が原因である可能性があります。これを機能させるために私がしなければならなかったのは(@imrealashuが取った手順に加えて)...

route.php

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => 'AdminController@index'
]);

これはwebミドルウェアグループです。これより前は、別のadminミドルウェアグループやグループに入れてみましたauth:adminが、うまくいきませんでした。ミドルウェアをルート自体の管理者として指定した場合にのみ機能しました。なぜなのかはわかりませんが、他の人が私と同じように髪の毛を抜く手間を省いてくれることを願っています。


マルチ認証zipファイルをezistingプロジェクトファイルに置き換えてダウンロードした後、DBを移行すると、このエラーが表示されます。[Symfony \ Component \ Console \ Exception \ RuntimeException]引数が不足しています(「name」がありません)。
G Naga Subrahmanyam

実際、私にとって管理者はログインしていますが、管理者にリダイレクトされていません。これを実行した後、それは機能しますが、なぜそうなのか教えてください。他のルートを登録する必要があったので、他のルートを登録しRoute::group(['middleware' => ['admin']], function () { //Admin Routes... });なければなりませんでした
Leap Hawk

0

laravel 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();

乾杯。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.