# サイト認証ゲート（SiteAuthGate）

## 概要

本番環境で未ログインユーザーに対し、メニュー非表示カテゴリのページを 404 で返すミドルウェア。ページの存在自体を隠すことで、セキュリティとUXを両立する。

## 動作フロー

```
リクエスト
  ├─ ログイン済み → スルー
  ├─ 認証系ルート（login, register 等） → スルー
  ├─ require_auth_all_pages が有効 → ログインへリダイレクト
  ├─ 公開ルートプレフィックス → スルー
  ├─ カテゴリON＋対応ルート → スルー
  ├─ page_managements で requires_auth=false → スルー
  ├─ 本番 & メニュー非表示カテゴリ → 404
  └─ その他 → ログインへリダイレクト
```

## 常時許可されるルート

### 認証系ルート（ALWAYS_ALLOWED）

| プレフィックス | 対象 |
|-------------|------|
| `login` | ログインページ |
| `register` | ユーザー登録 |
| `logout` | ログアウト |
| `password.` | パスワードリセット |
| `sitemap` | サイトマップ |

### 公開ルートプレフィックス（PUBLIC_ROUTE_PREFIXES）

| プレフィックス | 対象 |
|-------------|------|
| `contact.` | お問い合わせ |
| `price_compare.` | 価格比較 |
| `posts.` | 公開記事 |
| `station_guide.` | 駅ガイド |
| `regional_sale.` | 地域セール |

### カテゴリベースの公開制御（CATEGORY_ROUTE_MAP）

`setting_sites.menu_category_ids` に含まれるカテゴリに対���するルートは、ゲストにも公開:

| ルートプレフィックス | カテゴリslug |
|-------------------|-------------|
| `horse_racing.` | `horse-racing` |
| `comic.` | `content` |

## データベース連携

| テーブル | 用途 |
|---------|------|
| `setting_sites` | `app_name` に対応するサイト設定。`menu_category_ids`（JSON）でメニュー表示カテゴリを指定 |
| `page_managements` | 各ページの `requires_auth` フラグと `page_category_id` |
| `page_categories` | カテゴリマスタ（`id`, `slug`） |
| `feature_settings` | `require_auth_all_pages` フラグ（全ページログイン必須モード） |

## キャッシュ

パフォーマンスのため、以下のキーで1時間キャッシュ:

| キー | 内容 |
|------|------|
| `site_auth_gate:{appName}` | サイト設定（`menu_category_ids`） |
| `site_auth_gate:category_slugs:{ids}` | カテゴリIDに対応するslug一覧 |
| `site_auth_gate:public_routes` | `requires_auth=false` のルート名一覧 |
| `site_auth_gate:visible_routes:{ids}` | メニュー表示カテゴリに属するルート名一覧 |

`SiteSettingController` でサイト設定を更新すると、関連キャッシュがクリアされる。

## ファイル構成

```
app/Http/Middleware/Core/
└── SiteAuthGate.php                 # ミドルウェア本体

app/Http/Controllers/Admin/
└── SiteSettingController.php        # サイト設定管理（キャッシュクリア含む）

tests/Feature/
└── SiteAuthGateTest.php             # ミドルウェアのテスト
```
