3. 認証の導入

## **3.1 Laravelの標準認証について**
Laravelでは、認証機能が標準で提供されており、主に以下の方法で認証を実装できます。

### ** Laravelの認証オプション**
| 方法 | 概要 |
|------|------|
| **Laravel Breeze** | 軽量な認証システム（初心者向け） |
| **Laravel Jetstream** | 高機能な認証システム（チーム管理向け） |
| **Sanctum** | APIトークンベースの認証（SPAやモバイルアプリ向け） |
| **Passport** | OAuth2ベースの認証（より高度なAPI認証） |

初心者向けには、**Laravel Breeze** を使用するのが最も簡単です。

---

## **3.2 Laravel Breezeの導入**
Laravel Breezeは、シンプルな認証機能を提供するパッケージです。

### ** Breezeのインストール**
```bash
composer require laravel/breeze --dev
php artisan breeze:install
npm install && npm run dev
php artisan migrate
```

### ** ルートの設定**
開発サーバーを起動して、ログイン・登録ページを確認する。

```bash
php artisan serve
```

`http://127.0.0.1:8000/login` にアクセス。

---

## **3.3 ユーザー登録を無効にする**
デフォルトでは、Laravelの認証システムでは誰でも登録できますが、それを防ぐ方法を紹介します。

### ** ルート（`register`）を無効化**
**`routes/web.php`** を開き、`register` ルートを削除または無効化します。

```php
Route::get('/register', function () {
    abort(403, '新規登録はできません');
});
Route::post('/register', function () {
    abort(403, '新規登録はできません');
});
```

---

## **3.4 コントローラでユーザー登録を制限**
BreezeやJetstreamを使用している場合、`RegisterController` を変更して登録を無効化できます。

** `app/Http/Controllers/Auth/RegisterController.php` の修正**
```php
use Illuminate\Http\Request;

public function register(Request $request)
{
    abort(403, '新規登録は管理者のみ可能です');
}
```

---

## **3.5 Bladeテンプレートから登録リンクを削除**
フロントエンドの `register` へのリンクを削除し、登録フォームが表示されないようにします。

** `resources/views/auth/login.blade.php`**
```blade
{{-- ユーザー登録リンクを削除 --}}
{{-- <a href="{{ route('register') }}">新規登録</a> --}}
```

---

## **3.6 ミドルウェアで登録を制限**
管理者のみがユーザー登録できるようにするために、カスタムミドルウェアを作成します。

** `app/Http/Middleware/CheckAdmin.php` を作成**
```php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CheckAdmin
{
    public function handle(Request $request, Closure $next)
    {
        if (!Auth::check() || Auth::user()->role !== 'admin') {
            abort(403, '管理者のみユーザーを登録できます');
        }

        return $next($request);
    }
}
```

** `app/Http/Kernel.php` にミドルウェアを登録**
```php
protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\CheckAdmin::class,
];
```

** `register` にミドルウェアを適用**
```php
Route::post('/register', [RegisterController::class, 'register'])->middleware('admin');
```

---

## **3.7 管理者が手動でユーザーを追加**
### ** Artisanコマンドで手動追加**
```bash
php artisan tinker
```
```php
use App\Models\User;
use Illuminate\Support\Facades\Hash;

User::create([
    'name' => 'Admin User',
    'email' => 'admin@example.com',
    'password' => Hash::make('password123'),
    'role' => 'admin'
]);
```

### ** 管理画面を作成してユーザー追加**
```php
Route::middleware('admin')->group(function () {
    Route::get('/admin/users', [UserController::class, 'index']);
    Route::post('/admin/users/create', [UserController::class, 'store']);
});
```

```php
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

public function store(Request $request)
{
    $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8',
    ]);

    User::create([
        'name' => $request->name,
        'email' => $request->email,
        'password' => Hash::make($request->password),
    ]);

    return redirect('/admin/users')->with('success', 'ユーザーを追加しました');
}
```

---

## ** まとめ**
| 方法 | 内容 |
|------|------|
| **ルートを無効化** | `routes/web.php` で `register` ルートを削除 |
| **コントローラで制限** | `RegisterController` で `abort(403)` を返す |
| **Bladeからリンク削除** | `register` へのリンクを削除 |
| **ミドルウェアで制限** | `admin` ミドルウェアを作成し、管理者のみ登録可 |
| **管理者が手動登録** | `php artisan tinker` または管理画面で追加 |

これで、**一般ユーザーが自由に登録できないようにしつつ、管理者が手動でユーザーを追加できるようになります！**