質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.64%

Laravelでマルチ認証を実装する際のガードについて

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 3,444

kriht

score 26

Laravelデフォルトの認証に加え、管理者用の認証機能を実装したいです。
ネットの記事を参考にして実装してみましたが、ガードの設定周りで躓いています。

前提
・Adminモデルとadminsテーブルが存在し、基本的にUserと同じ
・管理者はログインのみ (UIでの新規登録、パスワードリセット等は必要ない)
・Adminの新規登録は Tinker から行う
・管理者ページのURLは全て /admin 下にする

疑問点

(1) ガードに関する認識は以下で合ってますか?

ガードのデフォルトがwebなら、
・middleware('auth') は middleware('auth:web') と同義。
・Auth::check()は 
(ミドルウェア保護が無いルートでは)Auth::guard('web')->check() と同義
(保護が有るルートでは)Auth::guard('保護ガード名')->check() と同義

(2)config\auth.phpの設定は、Adminの分をguardとproviderに追加するだけですよね?

読んだ記事によってはwebをuserに変更しています。恐らくルート保護の表記をわかりやすくするだけで特に意味はない思いますが。一般ユーザーのガードはwebのままでも問題ないですよね?

とりあえず現在以下のように設定しています。

'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
],

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
        //追加
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
],

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
         //追加
         'admins' => [
             'driver' => 'eloquent',
             'model' => App\Admin::class,
         ],
    ],

'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
],

その他のコードも一応記載しておきます

Adminモデル

class Admin extends Authenticatable
{
    protected $fillable = [
        'name', 'email', 'password',
    ];
    protected $hidden = [
        'password', 'remember_token',
    ];
}


app\Exceptions\Handler.php

//追加
public function unauthenticated($request, AuthenticationException $exception)
{
        if($request->expectsJson()){
            return response()->json(['message' => 'Unauthenticated'], 401);
        }
        if (in_array('admin', $exception->guards())) {
            return redirect()->guest(route('admin.login'));
        }
        return redirect()->guest(route('login'));
}


ルーティング

Route::group(['prefix' => 'admin'], function(){
    // ログイン
    Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin.login');
    Route::post('login', 'Admin\LoginController@login')->name('admin.login');
});

Route::group(['prefix' => 'admin', 'middleware' => 'auth:admin'], function() {
    // 管理者ホーム
    Route::get('/home', 'Admin\HomeController@index')->name('admin.home');
    // ログアウト
    Route::get('logout', 'Admin\LoginController@logout')->name('admin.logout');
});


LoginController

protected $redirectTo = '/admin/home';

public function __construct()
{
    $this->middleware('guest:admin')->except('logout');
}

public function showLoginForm()
{
     return view('admin.login');
}

protected function guard()
{
     return Auth::guard('admin');
}

public function logout(Request $request)
{
     Auth::guard('admin')->logout();
     $request->session()->flush();
     $request->session()->regenerate();
     return redirect()->route('admin.login');
}


app\Http\Middleware\RedirectIfAuthenticated.php

public function handle($request, Closure $next, $guard = null)
{
        if (Auth::guard($guard)->check()) {
            if($guard === 'admin'){
                return redirect('/admin/home');
            }
            return redirect('/home');
        }
        return $next($request);
}

参考にした記事です。
Laravel5.7でMulti Authを試す。
Laravel 5.7 マルチ認証で管理者とユーザーの認証を分ける
【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた

何か問題点がありましたら教えてください。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

そもそもの話としてちょっとした管理者権限を作りたいだけならマルチ認証なんて使う必要がないので…。

Horizonとか公式パッケージのやり方を真似すればいい。
https://readouble.com/laravel/5.8/ja/horizon.html#dashboard-authorization
https://readouble.com/laravel/5.8/ja/telescope.html#dashboard-authorization

認可使って普通のUserの内条件を満たすユーザーを管理者とする。

Gate::define('admin', function ($user) {
    return in_array($user->id, [
           1,
    ]);
});

ルーティング

Route::prefix('admin')->middleware('can:admin')->group(function(){

});

https://readouble.com/laravel/5.8/ja/authorization.html

公式情報を見ずにぐぐるから無駄に複雑な作り方してしまう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/27 18:17

    確かに一般ユーザーと同じ認証にして、管理者ページを認可するやり方の方が簡単ですね。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る