まとめ
以上で、シンプルな画像掲示板にログイン機能の実装ができました。
実際には掲示板のデザインとログイン機能関連の画面のデザインについての整合性を取る必要はありますが、基本的な機能として
- サインアップ
- ログイン・ログアウト
- ログインしていなければ、ログイン後ページを見ることはできない
- ログインユーザーの情報を取得
というログインに関する基本を全て実装することができました。
認証関連処理についてはさらに高度な内容もあります。
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'));
}
}