laravel 5.2で実装する、マルチ認証の作り方

laravel5.2からマルチ認証が基本実装されたので、やってみました。

ちなみに、マルチ認証とは、

・フロント画面 – ユーザー認証
・管理画面 – 管理者認証

のように、2つ以上の認証を1つのサイトで実現する方法です。

laravel5.2のインストールおよびデータベース、メールの設定などが完了している状態からのスタートとします。

出来上がりのファイルは、以下githubにアップ済みです。

■github( dog-ears/laravel-multi-auth )
https://github.com/dog-ears/laravel-multi-auth

では、やってみましょう。

(i) 通常のユーザー認証をセットアップする

これは簡単、以下2つのコマンド実行でOKです。

php artisan make:auth
php artisan migrate

 

(ii) 管理者用のデータベース作成

usersのマイグレーションファイルをコピーして作成
テーブル名は、adminsとします。

■/database/migrations/2016_05_20_000000_create_admins_table.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-11

基本、users -> adminsに変更で。

php artisan migrate

※password_resetsテーブルは共用とします。

 

(iii) configの修正

■/config/auth.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-9

    'guards' => [
(中略)
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
(中略)
    'providers' => [
(中略)
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
(中略)
    'passwords' => [
(中略)
        'admins' => [
            'provider' => 'admins',
            'email' => 'adminAuth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ],

guardsで、ユーザー認証の種別を定義(今回は、web->ユーザー用、admin->管理者用です。)
providersで、使用するモデルを定義
passwordsで、パスワードリセットの種別を定義します。

passwordの項目は以下の通り。

・provider -> 上述した通り、使用するモデル。
・email -> 再設定メールの本文のviewファイルを指定
・table -> パスワードリセットに使用するテーブル
・expire -> メールを受け取ってから、パスワード再設定可能な時間(分)

 

(iv) モデルの追加

/app/User.php から複製

■/app/Admin.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-0

基本UserをAdminに変更する。

 

(v) コントローラーの追加

/app/Http/Auth を丸ごとコピー
/app/Http/AdminAuth とする。

■/app/Http/AdminAuth/AuthController.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-1

protected $redirectTo = '/admin/home';

これは、ログイン(および新規登録)後の飛び先。

また、以下記述を追加する。

protected $guard = 'admin';

-> 使用するガードの種別

protected $loginView = 'adminAuth.login';

-> ログインビューの指定

protected $registerView = 'adminAuth.register';

-> 新規登録ビューの指定

■/app/Http/AdminAuth/PasswordController.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-2

$this->middleware('guest:admin');

上記の記述で、guestミドルウェアのガードにadminを指定しています。
ちなみにguestミドルウェアは、ログインしてない場合、ログインページに強制移動させるよ。というミドルウェア。

 

また、以下を追加します。

protected $redirectTo = '/admin/home';

-> パスワード再設定後の飛び先。

protected $linkRequestView = 'adminAuth.passwords.email';
protected $resetView = 'adminAuth.passwords.reset';

-> パスワードリセット用のビューの場所を指定。

protected $guard = 'admin';

-> ガードの種別指定。

protected $broker = 'admins';

-> 紛らわしいですが、/config/auth.php内で指定したpasswordの種別を指定。

 

/app/Http/HomeController.php から
/app/Http/AdminHomeController.php を作成

■/app/Http/AdminHomeController.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-3

$this->middleware('auth');
↓
$this->middleware('auth:admin');

こちらは、authミドルウェアにadminガードを指定。
authミドルウェアは、ログインしている場合、$redirectToのページに強制移動させるよ。というミドルウェア。

 

(vi) ミドルウェアの修正

■/app/Http/Middleware/Authenticate.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-6

このミドルウェアが設定されていると、
ログインしていない場合に、ログイン画面にリダイレクトされる。

なので、ガードにより分岐してそれぞれのログイン画面にリダイレクトするようにする。

return redirect()->guest('login');
↓
if( $guard === 'admin' ){
    return redirect()->guest('admin/login');
}else{
    return redirect()->guest('login');
}

 

■/app/Http/Middleware/RedirectIfAuthenticated.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-7

このミドルウェアが指定されていると、
ユーザーがログインしている場合、特定のページにリダイレクトされる。

return redirect('/');
↓
if( $guard === 'admin' ){
    return redirect('/admin/home');
}else{
    return redirect('/home');
}

 

(vii) ルートの修正

以下、追加。

■/app/Http/routes.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-8

Route::auth();で生成されるルートを一部修正したものになります。

// Authentication Routes...
$this->get('admin/login', 'AdminAuth\AuthController@showLoginForm');
$this->post('admin/login', 'AdminAuth\AuthController@login');
$this->get('admin/logout', 'AdminAuth\AuthController@logout');

// Registration Routes...
$this->get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
$this->post('admin/register', 'AdminAuth\AuthController@register');

// Password Reset Routes...
$this->get('admin/password/reset/{token?}', 'AdminAuth\PasswordController@showResetForm');
$this->post('admin/password/email', 'AdminAuth\PasswordController@sendResetLinkEmail');
$this->post('admin/password/reset', 'AdminAuth\PasswordController@reset');

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

 

(viii) ビューの修正

/resources/views/auth から
/resources/views/adminAuth を作成

もろもろパスの頭に/adminを追加。
わかりやすいようタイトルにもAdminを追加する。

/resources/views/home.blade.php から
/resources/views/admin/home.blade.php を作成

 

(ix) おまけ 確認用として、ナビに各リンクを追加する。

■/resources/views/layouts/app.blade.php
https://github.com/dog-ears/laravel-multi-auth/commit/ca0c237d44ec8cd9facdd3e7fa57139a5aca28a6#diff-24

各ログイン状況チェック方法は、以下の通り。

@if (Auth::check())
[ ユーザーとしてログイン済みの場合に表示 ]
@endif
@if (Auth::guest())
[ ユーザーとしてログインしていない場合に表示 ]
@endif
Auth::guard('admin')->check()
[ 管理者としてログイン済みの場合に表示 ]
@endif
Auth::guard('admin')->guest()
[ 管理者としてログインしていない場合に表示 ]
@endif

 

(x) おまけ2 メールの設定

cloud9推奨のテスト用SMTPサーバーmailtrap.ioを使ってみる。

■mailtrap
https://mailtrap.io/

githubアカウントで入れて便利。

.env で、ユーザーネーム、パスワードを定義すれば、即使えます。

設定すると、実際の宛先まではメールが飛ばずに、
mailtrap上で送信されるメールを確認できるようになります。

 

以上、マルチ認証についてでした。

“laravel 5.2で実装する、マルチ認証の作り方” への 10 件のフィードバック

  1. Their is a Mistake in section 3 :
    in guards array, provider should be admin not use

    ‘provider’ => ‘users’,

    Should be
    ‘provider’ => ‘admins’,

  2. hi need help here, is there a way to create 2 step login? By default, the login for laravel system is: User->Login Page->Dashboard What i want to achieve here is user -> company login section -> user login -> dashboard

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です