前回までの記事ではLaravel と管理画面パッケージ「Voyager」の実装、およびVoyagerの機能紹介などをお伝えしていますが、今回もLaravel関連です!
サイトを個人で開発、運用する方にはほぼLaravel+Voyagerデフォルトで運用していただいて問題ないのですが、管理ユーザーとフロントのユーザーは別に管理するよっていう開発環境ですと、いくつか問題があります、、、
・管理者とフロントのユーザーを同じテーブルで管理すると、管理画面にログイン出来ない権限を用意する必要がある。
・管理画面とフロントのユーザーを別テーブルで管理するとき、Laravelのバージョンによって認証方法が違う(guardだったりProviderだったり)
・認証セッションがぶつかる(管理画面でログインしたらフロントの認証が切れるなど、、、お客様がいる場合の開発ではやべーバグです)
ですのでauth.php, セッション周りを弄って、フロントと管理画面がぶつからないようにしましょう!
①Laravel5.* プロジェクト作成
1 |
composer create-project --prefer-dist laravel/laravel auth |
適当にプロジェクトを作成します。今回は認証周りなので、authとしました。.envファイルなど、各設定は環境に合わせて実施してください!
②認証機能追加
1 |
php artisan make:auth |
laravelには認証機能がデフォルトで備わっていますので、上記コマンドでRegisterControllerやLoginControllerなど、認証に必要な基本機能を一発で出力してくれます。
③Customerモデル作成、マイグレーション
1 |
php artisan make:model Customer -m |
Customerモデルをartisanコマンドで作成します。オプションに-mを記述すると、マイグレーションファイルも一緒に生成してくれます。
マイグレーションファイルcreate_users_table.php中のテーブル情報を、create_customers_table.phpにコピーし、マイグレーションします。
1 |
php artisan migrate |
④customersテーブルで認証
・auth.phpを編集します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//デフォルトの認証ガードを変更 'defaults' => [ 'guard' => 'customer', 'passwords' => 'customer', ], 'guards' => [ //認証ガード追加 'customer' => [ 'driver' => 'session', 'provider' => 'customer', ], ], 'providers' => [ //認証プロバイダー追加 'customer' => [ 'driver' => 'eloquent', 'model' => App\Customer::class, ], ], 'passwords' => [ //password追加 'customer' => [ 'provider' => 'customer', 'table' => 'password_resets', 'expire' => 60, ], ], |
もともとあったwebとかのguardはvoyager実装の段階で使うので、デフォルトguard以外は全て追記してください。削除、コメントアウトは必要ありません。
・RegisterController.phpも編集します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
use App\Customer; protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|string|max:255', //'email' => 'required|string|email|max:255|unique:users', 'email' => 'required|string|email|max:255|unique:customers', //unique:usersから変更 'password' => 'required|string|min:6|confirmed', ]); } protected function create(array $data) { return Customer::create([ //モデルを変えます 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); } |
ここまで出来たらフロントのユーザー認証はcustomersテーブルを使用したものに切り替わっているはずです!出来ない場合は、編集漏れがないか、artisan serveをやり直してみるなどしてみてください。
⑤Voyagerインストール
⑥auth.php, session.php, .envファイルの編集
・.env
1 2 3 |
//追記 SESSION_COOKIE=auth SESSION_COOKIE_ADMIN=auth-admin |
・auth.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
- return [ + $conf = [ //以下を最後に追記 $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; if (strpos($uri, '/admin/') === 0 || $uri === '/admin') { $conf['defaults'] = [ 'guard' => 'user', 'passwords' => 'users', ]; } return $conf; |
・session.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
- return [ + $conf = [ //以下を最終行に追記 $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; if (strpos($uri, '/admin/') === 0 || $uri === '/admin') { $conf['cookie'] = env( 'SESSION_COOKIE_ADMIN', str_slug(env('APP_NAME', 'laravel'), '_').'_admin_session' ); } return $conf; |
大体こんな感じでセッションを分離できます。
Voyagerはデフォルトでusersテーブルを使用して認証を行なっています。vendor以下はなるべくいじりたくないので、customersテーブルを用意してみました。
[…] https://tac-blog.tech/index.php/2018/08/14/voyager-multi-auth/ […]
引用ありがとうございます。今後ともよろしくお願いいたします!