カテゴリ: CodeIgniter 更新日: 2026/05/08

CodeIgniterでアクセス制御(認可)を実装!初心者でもわかるセキュリティ設計

CodeIgniterでアクセス制御(認可)を実装する設計例
CodeIgniterでアクセス制御(認可)を実装する設計例

先生と生徒の会話形式で理解しよう

生徒

「CodeIgniterで、特定のページを管理者だけが見れるようにしたいのですが、どうすればいいですか?」

先生

「それは『アクセス制御』や『認可』と呼ばれる仕組みを使えば実現できますよ。初心者の方にもわかりやすく解説しますね。」

生徒

「難しそうですが、私にもプログラムで作れますか?」

先生

「大丈夫です!鍵付きのドアを作るようなイメージで、一歩ずつ進めていきましょう!」

1. アクセス制御と「認可」の基本を知ろう

1. アクセス制御と「認可」の基本を知ろう
1. アクセス制御と「認可」の基本を知ろう

ウェブサイトを作っていると、「一般ユーザーは見れるけれど、編集ボタンは管理者だけが押せるようにしたい」という場面が出てきます。このように、人によってできることを制限することをアクセス制御と言います。

プログラミングの世界では、よく似た言葉で「認証」と「認可」という言葉が出てきます。この違いを、マンションのオートロックに例えてみましょう。

  • 認証(Authentication):マンションの入り口で鍵を開けて中に入ること。「あなたは誰ですか?」を確認することです。ログイン画面でIDとパスワードを入れる作業がこれにあたります。
  • 認可(Authorization):中に入った後、自分の部屋には入れるけれど、他の人の部屋や管理室には入れないようにすること。「あなたにはこの権限がありますか?」を確認することです。

今回は、CodeIgniter(コードイグナイター)という便利な道具を使って、この「認可」の仕組みをどうやって設計するかを学んでいきましょう。CodeIgniterはPHPというプログラミング言語で書かれた、ウェブサイトを効率よく作るためのフレームワーク(枠組み)です。

2. 権限を管理する「ロール」という考え方

2. 権限を管理する「ロール」という考え方
2. 権限を管理する「ロール」という考え方

アクセス制御を設計する上で欠かせないのがロール(役割)という考え方です。ユーザー一人ひとりに「あなたは編集者」「あなたは閲覧者」とラベルを貼っていくイメージです。パソコンを触ったことがない方でも、学校の「図書委員」や「保健委員」を想像すると分かりやすいかもしれません。図書委員だけが本を貸し出すボタンを押せる、というルールを作るのです。

データベースという情報の保管場所に、ユーザーごとの役割を保存しておきます。例えば、roleという名前の箱を作って、そこに「admin(管理者)」や「user(一般)」という文字を入れておきます。プログラムはこの箱の中身を見て、処理を分けていきます。

3. ログイン状態を確認するシンプルなプログラム

3. ログイン状態を確認するシンプルなプログラム
3. ログイン状態を確認するシンプルなプログラム

まずは、そもそもログインしているかどうかを確認するプログラムを見てみましょう。CodeIgniterでは「セッション」という仕組みを使って、ログインしている人の情報を一時的に保存します。もしログインしていなければ、ログイン画面に追い返すという処理を書きます。


// ユーザーがログインしているかチェックする例
$session = session();
$isLoggedIn = $session->get('isLoggedIn');

if (!$isLoggedIn) {
    // ログインしていなければ、ログインページへ飛ばす
    return redirect()->to('/login');
}

このコードでは、$session->get('isLoggedIn')という部分で、合言葉(セッション情報)を持っているか確認しています。!は「〜ではない」という意味なので、ログインしていない場合にredirect(別のページへ移動させること)を実行しています。これがアクセス制御の第一歩です。

4. 管理者かどうかを判定する条件分岐

4. 管理者かどうかを判定する条件分岐
4. 管理者かどうかを判定する条件分岐

次に、ログインしている人の中でも「管理者だけ」が通れる道を作ります。ここでは、先ほどお話しした「ロール」を使います。PHPのif文を使って、「もしロールがadminだったら許可する」という命令を書きます。


// ユーザーの役割(ロール)を取得
$userRole = $session->get('role');

if ($userRole === 'admin') {
    echo '管理者専用の管理画面を表示します。';
} else {
    echo 'あなたにはアクセス権限がありません。';
}

実行結果は以下のようになります。


管理者専用の管理画面を表示します。

このように、プログラムの中で条件によって出すメッセージや機能を切り替えるのが「認可」の核となる部分です。===というのは、左右のものが全く同じであるという意味の記号です。

5. 共通のチェック処理を「フィルター」で作る

5. 共通のチェック処理を「フィルター」で作る
5. 共通のチェック処理を「フィルター」で作る

全てのページでいちいち「あなたは管理者ですか?」と書くのは大変です。CodeIgniterにはFilter(フィルター)という便利な機能があります。これは、目的地(ページ)にたどり着く前に、必ず通らなければならない「検問所」のようなものです。検問所で一括してチェックを行うことで、プログラムをスッキリさせ、セキュリティ対策を強化できます。

フィルターを使うと、新しいページを増やすたびにチェック処理を書き足す必要がなくなり、書き忘れによるセキュリティホール(欠陥)を防ぐことができます。初心者の方は、まずは「自動的にチェックしてくれる便利な関所があるんだな」と覚えておけば大丈夫です。

6. データベースでユーザー情報を管理する

6. データベースでユーザー情報を管理する
6. データベースでユーザー情報を管理する

実際の開発では、ユーザーの情報を「データベース」という表形式のデータで管理します。Excelのような表をイメージしてください。そこに「名前」「パスワード」「役割」という列があります。プログラムはこの表を検索して、現在アクセスしている人がどの役割を持っているかを調べます。


// データベースからユーザーの権限レベルを確認する疑似コード
$db = \Config\Database::connect();
$user = $db->table('users')->getWhere(['id' => $userId])->getRow();

// 権限レベルが10以上なら管理者とする
if ($user->auth_level >= 10) {
    echo '高度な設定変更が可能です。';
} else {
    echo '一般設定のみ閲覧可能です。';
}

この例では、文字ではなく数字(権限レベル)で比較しています。数字を使うと、「5以上は編集可能」「10以上はシステム設定も可能」といったように、より細かいアクセス制御がしやすくなります。

7. 画面上のボタンを表示・非表示にする工夫

7. 画面上のボタンを表示・非表示にする工夫
7. 画面上のボタンを表示・非表示にする工夫

アクセス制御は、ページそのものを見せないだけでなく、画面上の「見た目」を変えることも大切です。一般ユーザーには「削除ボタン」を見せないようにすることで、うっかり操作ミスを防ぐことができます。HTMLの中にPHPの条件分岐を混ぜて書く手法です。


<div class="container">
    <h1>記事一覧</h1>
    <p>誰でも読めるニュース記事です。</p>

    <?php if ($role === 'admin'): ?>
        <button class="btn btn-danger">この記事を削除する</button>
    <?php endif; ?>
</div>

このコードでは、if ($role === 'admin')という条件に当てはまる時だけ、削除ボタンが表示されます。これによって、管理者以外にはボタンそのものが存在しないように見せることができます。これも立派なアクセス制御のテクニックの一つです。

8. セキュリティ対策で気を付けるべきポイント

8. セキュリティ対策で気を付けるべきポイント
8. セキュリティ対策で気を付けるべきポイント

最後に、アクセス制御を実装する際に絶対に忘れてはいけない注意点をお伝えします。それは、「画面からボタンを消しただけで安心しないこと」です。悪い人は、ボタンがなくても特殊な方法で直接プログラムを呼び出そうとします。

ですので、必ず「画面の表示を切り替える処理」と「サーバー側で実行を禁止する処理」の両方をセットで行う必要があります。二重に鍵をかけるイメージですね。CodeIgniterの機能を正しく使えば、こうした強固なセキュリティを比較的簡単に作ることができます。

プログラミングを始めたばかりの時は難しく感じるかもしれませんが、まずは「誰が、何をできるか」を紙に書き出してみることから始めてみましょう。それが立派なシステム設計の第一歩になります。少しずつ慣れていけば、自分だけの安全で便利なウェブアプリケーションが作れるようになりますよ!

カテゴリの一覧へ
新着記事
New1
Laravel
Laravelのルーティングでサブドメインを使う方法!初心者向けにやさしく解説
New2
Laravel
Laravelでマルチ言語ルートを設定する方法!ロケールごとのprefixで簡単管理
New4
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.2
Java&Spring記事人気No2
Symfony
SymfonyのRemember Me機能を完全解説!初心者でもわかるログイン保持の仕組み
No.3
Java&Spring記事人気No3
Laravel
Laravelでルートに中間処理を追加する方法!ミドルウェア活用ガイド
No.4
Java&Spring記事人気No4
Laravel
Laravelでドメインルートを使う方法!マルチドメイン対応を初心者向けに解説
No.5
Java&Spring記事人気No5
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterで多言語対応(Language)を徹底解説!言語切り替え機能を実装
No.7
Java&Spring記事人気No7
CodeIgniter
CodeIgniterでファイルアップロードとストレージ管理をマスター!初心者向け完全ガイド
No.8
Java&Spring記事人気No8
Laravel
LaravelのFeatureテストとUnitテストの違いを理解しよう