Laravel 5.8 認証

#認証
laravelだと以下のコマンドで認証機能に加えて
ログインユーザー登録とパスワードリセットのメール送信、
ユーザー登録時のメール確認なども付いている。
##make:auth
以下のコマンドで認証に必要なControllerとviewが一式コピーされる。

```bash
$ php artisan make:auth
```

routes/web.phpに以下の記載が追加される。

```php:routes/web.php
(略)
Route::resource('users', 'UserController');

// 以下が追加される
Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
```

route::listに以下のルーティングが追加される。

```bash
$ 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で設定する

```php:app/Http/Constrollers/UsersController.php
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にメニューを追加。ただしログインしている場合

```html:resources/views/layouts/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 メール確認](https://readouble.com/laravel/5.8/ja/verification.html)
上記の実装通りに進める。

###モデルの修正
```php:app/User.php
//class User extends Authenticatable
class User extends Authenticatable implements MustVerifyEmail
{
(略)
```

###DB修正
usersテーブルに`email_verified_at`カラムを追加する必要があるが5.8では標準で含まれている。

###ルーティングを変更

```php:routes/web.php
//Auth::routes();
Auth::routes(['verify' => true]);
```

これだけでメール確認の機能が実装されます。
但し、厳密にはメールでの登録手続きが完了する前にログインできてしまうので
認証方法を変える必要がある。

###middlewareのverifiedの設定
各コントローラクラスのコンストラクタでmiddlewareを呼び出し制限する。

```php:app/Http/Controllers/UserController.php

public function __construct()
{
    // ログイン済(メール認証済不問)
    // $this->middleware('auth');
    // メール認証済
    $this->middleware('verified'); // usersの全アクションにメール認証済が必要
}
```