#認証
laravelだと以下のコマンドで認証機能に加えて
ログインユーザー登録とパスワードリセットのメール送信、
ユーザー登録時のメール確認なども付いている。
##make:auth
以下のコマンドで認証に必要なControllerとviewが一式コピーされる。
$ php artisan make:auth
routes/web.phpに以下の記載が追加される。
(略)
Route::resource('users', 'UserController');
// 以下が追加される
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
route::listに以下のルーティングが追加される。
$ php artisan route:list
| | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,auth |
| | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest |
| | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest |
| | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web |
| | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest |
| | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest |
| | POST | password/reset | password.update | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest |
| | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest |
| | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest |
| | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest |
この時点で/loginにアクセスするとログイン画面が表示される。
###layouts/app.blade.php
make:auth
で作成されます。bootstrapのnav-barで実装されていて
ログインしていないと「ログイン」「登録」メニューが表示され
ログインすると「ログイン」「登録」が非表示、
代わりにログインユーザメニューと「ログアウト」のサブメニューが表示される。
このapp.blade.phpでコンテンツ部と分けられているので
既存のユーザー管理画面もそれに倣って変更する。
@yield('content')でコンテンツ部を表示するように設定。
*.blade.phpの設定
@extends('layouts.app');で上記レイアウトファイルを呼び出す。
@section('content')~@endsection('content')で
囲んだ内容が展開される
##認証の実装
各コントロールのconstructで行う。
ユーザーコントロールのconstructで設定する
public function __construct()
{
$this->middleware('auth'); // 全アクセスにログイン認証が必要
// ->except・・・認証を除外するアクション配列
// ->only・・・認証が必要なアクション配列
}
php artisan route:list
でusers系のアクションのmiddleware列で
authが追加されているのが確認できる。
ログイン後、/homeに遷移するようになっています。
変える場合はapp/Http/Conrollers/Auth/
配下のファイルの$redirectTo
の値を変更する
RegisterController.php
VerificationController.php
ResetPasswordController.php
LoginController.php
###nav-barへのユーザー一覧メニューの追加
app.blade.phpにメニューを追加。ただしログインしている場合
<!-- Left Side Of Navbar -->
<ul class="navbar-nav mr-auto">
<!-- Main Menu Links -->
@auth
<li class="nav-item">
<a class="nav-link" href="{{ url('users') }}">{{ __('Users') }}</a>
</li>
@endauth
</ul>
@auth~@endauth
でログイン状態の条件、
@guest~@endguest
でゲスト(非ログイン)状態の条件
この時点では、だれでもユーザー登録がし放題なので登録時にメール確認する機能を追加
##メール確認
Laravel 5.8 メール確認
上記の実装通りに進める。
###モデルの修正
//class User extends Authenticatable
class User extends Authenticatable implements MustVerifyEmail
{
(略)
###DB修正
usersテーブルにemail_verified_at
カラムを追加する必要があるが5.8では標準で含まれている。
###ルーティングを変更
//Auth::routes();
Auth::routes(['verify' => true]);
これだけでメール確認の機能が実装されます。
但し、厳密にはメールでの登録手続きが完了する前にログインできてしまうので
認証方法を変える必要がある。
###middlewareのverifiedの設定
各コントローラクラスのコンストラクタでmiddlewareを呼び出し制限する。
public function __construct()
{
// ログイン済(メール認証済不問)
// $this->middleware('auth');
// メール認証済
$this->middleware('verified'); // usersの全アクションにメール認証済が必要
}