自作PHP MVCフレームワークで実現!ログイン処理と役割別誘導の舞台裏

自作MVC

Webアプリケーションを構築する上で、ユーザー認証は避けて通れない要素です。特に、ログインしたユーザーの種類(管理者なのか、一般ユーザーなのか)によって表示する画面やアクセスできる機能を振り分ける仕組みは、多くのサービスで求められます。

今回は、私が自作のPHP MVCフレームワークで、この「ユーザー種別に応じたログイン後の誘導」をどのように実現したのか、そして、そこに至るまでにあった「ちょっとしたひらめき」と「セッション管理の基本」についてご紹介したいと思います。

「サブドメイン」から「パス」へ:管理画面構築の小さな転換点

まず、今回のログイン処理の話のきっかけからお話しさせてください。

当初、私は自作フレームワークで管理画面を構築する際、ごく自然に admin.yourdomain.com のようなサブドメインを切って、そこに管理システムをデプロイしようと考えていました。一般的なWebサービスの構成としてもよく見られるパターンです。

しかし、ふとWordPressの /wp-admin という管理画面のURLを見たとき、こう思ったのです。

「待てよ、WordPressはサブドメインなんて使わずに、一つのドメインのパスで管理画面を実現しているじゃないか。これなら、わざわざサブドメインの設定をしたり、ドメイン間のセッション共有に悩んだりしなくても、もっとシンプルに管理画面を作れるのではないか?」

この「ひらめき」が、私の自作フレームワークにおける管理画面の設計思想を大きく変えました。一つのドメイン内で完結できれば、レンタルサーバーでのデプロイも、SSL証明書の設定も、そして最も重要な「セッション管理」もずっと楽になる、そう確信したのです。

この決断が、今回の「ユーザー種別に応じたログイン誘導」というテーマに繋がっていきます。

ログイン処理の要:セッション管理の基本をおさらい

管理者も一般ユーザーも、まずはログインをします。そして、ログインが成功したら、そのユーザーが「誰」で「どんな権限」を持っているのかをアプリケーションが記憶しておく必要があります。ここで登場するのが「セッション」です。

HTTPは元々、リクエストごとに状態を忘れてしまう「ステートレス」なプロトコルです。そのため、ユーザーがログインしている状態をページをまたいで維持するためには、セッションという仕組みが必要不可欠になります。

PHPでは、セッションを扱うために以下の基本的なステップを踏みます。

  1. session_start(): PHPスクリプトの冒頭でこの関数を呼び出すことで、セッションの利用を開始します。これにより、ユーザーのブラウザにセッションIDが保存されたクッキーが送られ、サーバー側でそのセッションIDに対応するセッションデータが利用可能になります。
  2. $_SESSION: このスーパーグローバル変数を通じて、セッションにデータを保存したり、取得したりできます。例えば、$_SESSION['user_id'] = $user_id; のようにユーザーIDを保存できます。
  3. セキュリティ対策: セッションハイジャックなどのリスクを軽減するため、ログイン成功時など重要なタイミングで session_regenerate_id(true); を使ってセッションIDを再生成することが強く推奨されます。

自作MVCフレームワークにおけるログイン処理の基本フロー

私の自作MVCフレームワークでは、以下のようなフローでログイン処理を実装しています。

  1. ログインフォームの表示(GETリクエスト) ユーザーが /login のURLにアクセスすると、AuthControllerが対応し、ログインフォームを含むViewファイルをレンダリングします。この際、CSRF対策としてトークンを生成し、セッションに保存するとともに、フォームの隠しフィールドに埋め込みます。
  2. 認証処理(POSTリクエスト) ユーザーがフォームにユーザー名とパスワードを入力して送信すると、同じくAuthControllerの別のメソッド(例えば login() メソッドのPOST処理部分)がそのリクエストを受け取ります。
    • 入力値のバリデーション(空ではないか、形式が正しいかなど)を行います。
    • ユーザー名とパスワードを元に、Model層を通じてデータベースからユーザー情報を取得します。
    • 取得したユーザーのハッシュ化されたパスワードと、入力されたパスワードを password_verify() で比較し、認証を行います。
  3. セッションへのユーザー情報保存 認証に成功した場合、重要なステップがこれです。 session_regenerate_id(true); でセッションIDを再生成した後、以下のような情報をセッションに保存します。PHP$_SESSION['user_id'] = $user['id']; // ユーザーID $_SESSION['user_name'] = $user['username']; // ユーザー名 $_SESSION['role'] = $user['role']; // ユーザーの役割 (例: 'admin', 'user') $_SESSION['logged_in'] = true; // ログイン状態を示すフラグ ここで保存する $_SESSION['role'] が、後の「役割に応じた誘導」の鍵となります。

ユーザー種別に応じた誘導先振り分けの実装

いよいよ、ログインしたユーザーを管理者向けダッシュボードや一般ユーザー向けダッシュボードへ振り分ける部分です。これは、上記のセッションへの情報保存直後に実装します。

PHP

// app/Controllers/AuthController.php (loginメソッド抜粋)

// ... 認証成功後 ...

if ($user['role'] === 'admin') {
    // 管理者の場合、管理画面ダッシュボードへリダイレクト
    header('Location: /admin/dashboard');
} else {
    // 一般ユーザーの場合、通常のダッシュボードへリダイレクト
    header('Location: /dashboard');
}
exit; // リダイレクト後は必ずexit;する

このように、セッションに保存した role の値に基づいて条件分岐を行い、適切なURLへHTTPヘッダーを使ってリダイレクトします。exit; を忘れると、リダイレクト処理が完了してもスクリプトの実行が続き、意図しない挙動を引き起こす可能性があるため、忘れずに記述します。

ログイン状態のチェックとアクセス制御

ログイン成功後のリダイレクトだけでなく、ユーザーがアプリケーション内の他のページにアクセスした際に、そのユーザーが本当にログインしているか、そしてそのページにアクセスする権限があるかをチェックする仕組みも重要です。

私のフレームワークでは、ルーティング処理の前(いわゆるミドルウェアやフィルターの概念)で、以下のようなチェックを行っています。

  • ログイン済みか?: アクセスしようとしているページがログインを必要とする場合、$_SESSION['logged_in']true かどうかを確認します。ログインしていなければ、ログインページに強制的にリダイレクトします。
  • 権限があるか?: 管理者ページ (/admin/*) へのアクセスの場合、$_SESSION['role']'admin' であることを確認します。そうでなければ、アクセス拒否のページを表示したり、トップページにリダイレクトしたりします。

これにより、URLを直接入力された場合でも、不正なアクセスを防ぎ、適切なユーザーのみがコンテンツを閲覧できるようにしています。

ログアウト処理も忘れずに

ログインがあれば、ログアウトも必要です。ログアウトは、セッションに保存されたユーザー情報を破棄する処理です。

PHP

// app/Controllers/AuthController.php (logoutメソッド例)

public function logout()
{
    $_SESSION = array(); // セッション配列を空にする
    session_destroy();   // セッションファイルをサーバーから削除

    // ログアウト後にトップページやログインページへリダイレクト
    header('Location: /');
    exit;
}

これにより、ユーザーは安全にセッションを終了し、ログイン状態が解除されます。

まとめ:自作フレームワークで築く、柔軟なログインフロー

「サブドメインを使わずにパスで管理画面を作る」という小さなひらめきから始まった今回のログイン処理の実装。セッション管理の基礎をしっかりと理解し、ユーザーの役割に応じたリダイレクトとアクセス制御を自力で構築することは、自作フレームワーク開発の醍醐味の一つです。

特にレンタルサーバーのような制約のある環境では、既成のフレームワークが提供する「おまかせ機能」が使えない分、一つ一つの仕組みを深く理解し、自分で作り上げる力が求められます。このプロセスは時に難しく感じるかもしれませんが、その分、完成した時の達成感はひとしおです。

ぜひ、皆さんも自分だけのMVCフレームワークで、賢く柔軟なログインフローを構築してみてください

投稿者プロフィール

bicstation
AIアシスタントとの協業が、この奮闘記を可能にした
実は、今回一連の記事を執筆し、そして開発を進める上で、強力な「相棒」の存在がありました。それが、私のような開発者をサポートしてくれるAIアシスタントです。

PHPの難解なエラーログに直面した時、記事の構成がなかなか思いつかなかった時、あるいはブログのテーマに合ったアイキャッチ画像が必要だった時など、数々の場面でAIに相談し、助けを借りました。

例えば、「レンタルサーバーでのphp.ini設定の難しさ」や「.envファイルの問題」といった、私が実体験で感じた課題を伝えると、AIは瞬時にその技術的な背景や影響を整理し、ブログ記事として読者に伝わりやすい文章の骨子を提案してくれました。また、記事のテーマに合わせたアイキャッチ画像も、具体的な指示を出すだけで瞬時に生成してくれたおかげで、コンテンツ作成のスピードが格段に向上しました。

AIは完璧ではありませんが、まさに「もう一人の自分」のように、アイデアの壁打ち相手になったり、膨大な知識の中から必要な情報を引き出してくれたり、私の思考を整理する手助けをしてくれたりします。一人で抱え込みがちな開発の課題も、AIと対話することで、新たな視点や解決策が見えてくることが多々ありました。

このブログを通じて私の奮闘記を共有できているのも、AIアシスタントの存在なくしては成し得なかったでしょう。これからも、AIを賢く活用しながら、開発と情報発信を続けていきたいと思います。

\ 最新情報をチェック /

コメント

PAGE TOP
タイトルとURLをコピーしました