まとめ

以上で、シンプルな画像掲示板にログイン機能の実装ができました。

実際には掲示板のデザインとログイン機能関連の画面のデザインについての整合性を取る必要はありますが、基本的な機能として

  • サインアップ
  • ログイン・ログアウト
  • ログインしていなければ、ログイン後ページを見ることはできない
  • ログインユーザーの情報を取得

というログインに関する基本を全て実装することができました。

認証関連処理についてはさらに高度な内容もあります。

https://readouble.com/laravel/5.5/ja/authentication.html

などを参考にして、理解を深めていきましょう。

マルチログインについて

adminを追加したい場合、Adminモデルを追加

php artisan make:model Admin -m

マイグレーションファイルを編集し、

+           $table->string('name');
+           $table->string('email')->unique();
+           $table->string('password');
+           $table->rememberToken();

マイグレーションを実行

php artisan migrate

モデルに追記

+use Illuminate\Foundation\Auth\User as Authenticatable;

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

+   protected $hidden = [
+       'password', 'remember_token',
+   ];
}

config/auth.phpを追記

auth.php

<?php

return [

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

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        // admin追記分
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],


        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],

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


        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
        // admin追記分
        'admins' => [
            'provider' => 'admins',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

];

sample_app/Http/Controllers/Admin/Auth/LoginController.php を sample_app/Http/Controllers/Auth/LoginController.php をベースに作成する。 (app/Http/Controllers/AuthをAdminフォルダにコピー)

LoginController.php

<?php

//修正
namespace App\Http\Controllers\Admin\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Auth; //追記

class LoginController extends Controller
{

    // use AuthenticatesUsers;
    use AuthenticatesUsers {
        logout as doLogout;
    }

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/admin'; //リダイレクト先(未作成)

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:admin')->except('logout');
    }

    public function showLoginForm()
    {
        return view('admin.auth.login'); //管理者ログインページのテンプレート(未作成)
    }

    protected function guard()
    {
        return Auth::guard('admin'); //管理者認証のguardを指定
     }

    public function logout(Request $request)
   {
       $this->guard('admin')->logout();
       // $request->session()->invalidate(); これが全部のSessionを消してしまう
       return redirect('/admin/login');
    }
}

ルーティング routes/web.phpに以下を追記

web.php

Route::prefix('admin')->name('admin::')->group(function() {
    // ログインフォーム
    Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
    // ログイン処理
    Route::post('login', 'Auth\LoginController@login');
    //ログアウト処理
    Route::post('logout', 'Auth\LoginController@logout')->name('logout');
});

// admin認証が必要なページ
Route::middleware('auth:admin')->group(function () {
    Route::get('admin', 'AdminController@index');
});

AdminControllerの追加

AdminController.php

省略

認証エラー時のための設定

app/Exceptions/Handler.php

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

//追加が必要
+use Illuminate\Http\Request;
+use Illuminate\Http\Response;
+use Illuminate\Auth\AuthenticationException;


class Handler extends ExceptionHandler
{
    protected $dontReport = [
        //
    ];

    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }

    //オーバーライド
+   protected function unauthenticated($request, AuthenticationException $exception)
+   {
+       if($request->expectsJson()) {
+           return response()->json(['error' => 'Unauthenticated.'], 401);
+       }

+       if(in_array('admin', $exception->guards())){
+           return redirect()->guest('admin/login');
+       }

+       return redirect()->guest(route('login'));
    }
}

参考url

https://qiita.com/s_of_p/items/3c066f56123cb05a24f1

https://qiita.com/zaburo/items/56ad432d5e6acb41852f

results matching ""

    No results matching ""