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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1181閲覧

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

kriht

総合スコア26

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/03/25 18:20

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のままでも問題ないですよね?

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

PHP

1'defaults' => [ 2 'guard' => 'web', 3 'passwords' => 'users', 4], 5 6'guards' => [ 7 'web' => [ 8 'driver' => 'session', 9 'provider' => 'users', 10 ], 11 'api' => [ 12 'driver' => 'token', 13 'provider' => 'users', 14 ], 15 //追加 16 'admin' => [ 17 'driver' => 'session', 18 'provider' => 'admins', 19 ], 20], 21 22'providers' => [ 23 'users' => [ 24 'driver' => 'eloquent', 25 'model' => App\User::class, 26 ], 27 //追加 28 'admins' => [ 29 'driver' => 'eloquent', 30 'model' => App\Admin::class, 31 ], 32 ], 33 34'passwords' => [ 35 'users' => [ 36 'provider' => 'users', 37 'table' => 'password_resets', 38 'expire' => 60, 39 ], 40],

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

Adminモデル

PHP

1class Admin extends Authenticatable 2{ 3 protected $fillable = [ 4 'name', 'email', 'password', 5 ]; 6 protected $hidden = [ 7 'password', 'remember_token', 8 ]; 9}

app\Exceptions\Handler.php

PHP

1//追加 2public function unauthenticated($request, AuthenticationException $exception) 3{ 4 if($request->expectsJson()){ 5 return response()->json(['message' => 'Unauthenticated'], 401); 6 } 7 if (in_array('admin', $exception->guards())) { 8 return redirect()->guest(route('admin.login')); 9 } 10 return redirect()->guest(route('login')); 11}

ルーティング

PHP

1Route::group(['prefix' => 'admin'], function(){ 2 // ログイン 3 Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin.login'); 4 Route::post('login', 'Admin\LoginController@login')->name('admin.login'); 5}); 6 7Route::group(['prefix' => 'admin', 'middleware' => 'auth:admin'], function() { 8 // 管理者ホーム 9 Route::get('/home', 'Admin\HomeController@index')->name('admin.home'); 10 // ログアウト 11 Route::get('logout', 'Admin\LoginController@logout')->name('admin.logout'); 12});

LoginController

PHP

1protected $redirectTo = '/admin/home'; 2 3public function __construct() 4{ 5 $this->middleware('guest:admin')->except('logout'); 6} 7 8public function showLoginForm() 9{ 10 return view('admin.login'); 11} 12 13protected function guard() 14{ 15 return Auth::guard('admin'); 16} 17 18public function logout(Request $request) 19{ 20 Auth::guard('admin')->logout(); 21 $request->session()->flush(); 22 $request->session()->regenerate(); 23 return redirect()->route('admin.login'); 24}

app\Http\Middleware\RedirectIfAuthenticated.php

PHP

1public function handle($request, Closure $next, $guard = null) 2{ 3 if (Auth::guard($guard)->check()) { 4 if($guard === 'admin'){ 5 return redirect('/admin/home'); 6 } 7 return redirect('/home'); 8 } 9 return $next($request); 10}

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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/26 00:54

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kriht

2019/03/27 09:17

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問