セッションを設定する方法 CodeIgniterの例

⚡ スマートサマリー

CodeIgniter Session Management はステートレス HTTP リクエスト間でユーザーデータを保存するため、アプリケーションはログインしたユーザー、カートアイテム、またはワンタイムのフラッシュメッセージを記憶できます。この例では、フラッシュメッセージとシミュレートされたログインを構築します。 CodeIgniterセッションライブラリ。

  • 🌐 セッションの目的: HTTPはステートレスであるため、セッションはサーバー上の別々のページリクエスト間でログイン状態などのユーザーデータを保持します。
  • 🍪 Cookieとセッションの比較: Cookieはユーザーのコンピューターに少量のデータを保存する一方、セッションはサーバーに大量のデータを保存するため、機密性の高い値を保存するのに適しています。
  • 💨 フラッシュデータ: set_flashdata() は、次のリクエストでのみ利用可能なメッセージを保存します。リダイレクト後の1回限りのフィードバックに最適です。
  • 🔑 ユーザーデータ: set_userdata() は、username や logged_in などの値をセッション全体にわたって保持し、unset_userdata() はログアウト時にそれらをクリアします。
  • 🛡️ アクセス制御: 再利用可能な check_auth() メソッドは、logged_in セッションキーが見つからない場合に、訪問者をログインページにリダイレクトします。
  • 🧪 実例: このチュートリアルでは、ルーティング、コントローラ、およびBulmaスタイルのビューを配線して、Flashと永続セッションの両方のフローをデモンストレーションします。
  • 🤖 AIアシスト: AIツールは、セッションコントローラーの骨組みを構築したり、ルートマップを生成したり、デプロイ前に安全でないセッション処理を検出したりすることができる。

CodeIgniterセッション管理

CodeIgniterセッション管理

デスクトップアプリケーションの開発経験がある方なら、グローバル変数を定義し、値を割り当てて、アプリケーションのライフサイクル全体を通して使用できることをご存知でしょう。複数のフォームを開閉する際、それぞれのリクエストからグローバル変数にアクセスできます。

つまり、アプリケーションの状態が維持されるということです。言い換えれば、ログイン時に会社名をグローバル変数に設定した場合、ログインフォームを閉じた後でも、その会社名の状態は保持されます。

HTTPは、先ほど説明したシナリオとは少し異なる動作をします。HTTPはステートレスです。つまり、あるリクエストで行った操作は、次のリクエストには引き継がれません。

この問題を回避するために、PHPには2つの解決策があります。1つは、ユーザーのコンピューターに保存される小さなファイルであるクッキーを使用する方法、もう1つは、クッキーに似ていますがサーバーに保存され、クッキーよりも容量が大きいセッションを使用する方法です。

セッションをいつ使用するか?

セッションは、ユーザーのページ間のアクティビティを把握したい場合に通常役立ちます。たとえば、ウェブサイトに保護されたエリアがあるとします。ユーザーは各ページでログインする必要はありません。ユーザーに一度ログインしてもらい、その情報をセッション変数に保存すれば、以降のリクエストで同じデータを再利用できます。その他のユースケースとしては、オンラインショップの運営などが挙げられます。ping システムでは、ユーザーはショップにアイテムを追加する必要があります。ping カート。

また、 CodeIgniterはセッションを使用して、次のリクエスト時にデータが一度だけ利用可能になるようにします。これは、データベースのレコードを編集・更新した後、ユーザーが別のページにリダイレクトされた際に何らかのフィードバックを返したい場合に便利です。

CI セッションを使用して他のページに Flash メッセージを送信する

このセクションでは、セッション ライブラリを使用して他のページに Flash メッセージを送信する方法を学習します。 Codeイグナイター.

新しいファイルSessionControllerを作成します

application/controllers/SessionController.php

次のコードを追加します

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class SessionController extends CI_Controller {

public function __construct() {
parent:: __construct();

$this->load->helper('url');
$this->load->library('session');
}

public function index() {

$this->load->view('sessions/index');
}

public function flash_message(){
$this->session->set_flashdata('msg', 'Welcome to CodeIgniter Flash Messages');
redirect(base_url('flash_index'));
}
}

ここに、

  • class SessionController extends CI_Controller {…} SessionController クラスを定義し、親コントローラー クラスを拡張します。
  • public function __construct() {…} は、親クラスを初期化し、URL ヘルパーとセッション ライブラリをロードするコンストラクター メソッドを定義します。
  • public function Index() {…} は、セッション インデックス ビューをロードするセッション インデックス メソッドを定義します。
  • public function flash_message(){…} は、フラッシュ データを設定して flash_index ルートにリダイレクトするフラッシュ メッセージ メソッドを定義します。

それでは、セッションデータの値を表示するビューを作成しましょう。

application/views ディレクトリ内に sessions という新しいディレクトリを作成します。

application/views/sessions に新しいファイルindex.phpを作成します。

次のコードを追加します

<html>
<head>
<title>Code Igniter Flash Session</title>
</head>
<body>
<p>The session value of msg is <b> <?= $this->session->userdata('msg');?> </b></p>
</body>
</html>

ここに、

session->userdata('msg');?> は、キーが msg のセッションデータの値を取得し、ブラウザに表示します。

それでは、セッションフラッシュメソッドのルートを作成しましょう。

application/config/routes.php を開きます

次の行を追加します

$route['flash_index'] = 'sessioncontroller';
$route['flash_message'] = 'sessioncontroller/flash_message';

それでは、組み込みサーバーを起動しましょう。 PHP フラッシュメッセージをテストしてください

ターミナルを開く

次のコマンドを実行します

cd C:\Sites\ci-app
php -S localhost:3000

ここに、

上記のコマンドは、アプリケーション コード ディレクトリを参照し、ポート 3000 で組み込みサーバーを起動します。

注:アプリケーションのパスは、ダウンロードした場所のパスと一致している必要があります。 CodeIgniterを使用する場合、コンピュータで空いているポート番号であればどれでも使用できます。ポート3000を使用する必要はありません。

以下を読み込んでください URL ウェブブラウザで: http://localhost:3000/flash_message

以下のページにリダイレクトされます。 URL、および次の結果が得られます。 http://localhost:3000/flash_index

Flash メッセージを他のページに送信する

Web ブラウザの更新ボタンをクリックするか、F5 キーを押します。

次の結果が得られます

Flash メッセージを他のページに送信する

CI セッションでのユーザー データの保存

それでは、もう少し高度な例を見てみましょう。ここでは、ユーザー認証をシミュレートするだけで、データベース内のユーザーレコードや送信されたパスワードを実際に検証する処理は行いません。

まずはルートから始めましょう

application/configにあるroutes.phpを開きます

次のルートを追加します

$route['login'] = 'sessioncontroller/login';
$route['authenticate'] = 'sessioncontroller/authenticate';
$route['settings'] = 'sessioncontroller/settings';
$route['dashboard'] = 'sessioncontroller/dashboard';
$route['logout'] = 'sessioncontroller/logout';

ここに、

  • $route['login'] = 'セッションコントローラー/ログイン'; ログインフォームを表示するルートを定義します
  • $route['authenticate'] = 'セッションコントローラー/認証'; 成功したユーザー ログインをシミュレートするルートを定義し、セッション ログイン データを設定します。
  • $route['設定'] = 'セッションコントローラー/設定'; ログインしているユーザーのみがアクセスできる保護されたページを定義します
  • $route['ダッシュボード'] = 'セッションコントローラー/ダッシュボード'; ログインしているユーザーのみがアクセスできる保護されたページを定義します。
  • $route['logout'] = 'セッションコントローラー/ログアウト'; セッションデータを破棄してユーザーをログアウトします

それでは、SessionControllerを更新しましょう。

application/controllers/SessionController.php を開きます

以下のメソッドを追加します

public function check_auth($page) {
if (!$this->session->userdata('logged_in')) {
$this->session->set_flashdata('msg', "You need to be logged in to access the $page page.");
redirect('login');
}
}

public function login() {
$this->load->view('sessions/login');
}

public function authenticate() {
$this->session->set_userdata('username', 'John Doe');
$this->session->set_userdata('logged_in', TRUE);
redirect(base_url('dashboard'));
}

public function dashboard() {
$this->check_auth('dashboard');
$this->load->view('sessions/dashboard');
}

public function settings() {
$this->check_auth('settings');
$this->load->view('sessions/settings');
}

public function logout() {
$this->session->unset_userdata('username');
$this->session->unset_userdata('logged_in');
redirect(base_url('login'));
}

ここに、

  • public function check_auth($page) {…} は、ユーザーがログインしているかどうかを確認し、ログインしている場合はページへのアクセスを許可するメソッドを定義します。ユーザーがログインしていない場合は、フラッシュメッセージとともにログインページにリダイレクトされます。
  • public function login() {…} は、sessions ディレクトリにあるログイン ビューを読み込みます。
  • public function authenticate() {…} は、logged_in および username キーのセッション ユーザー データを設定します。注: データベースに対してログイン詳細を検証していません。送信された詳細が適切であると仮定して、セッション データを設定するだけです。
  • public function dashboard() {…} は、$this->check_auth('dashboard'); を呼び出して、logged_in セッションキーが設定されていることを確認した後、ダッシュボード ページを読み込みます。
  • public function settings() {…} は設定ページを読み込みますが、これも保護されています
  • public function logout() {…} はセッション データを破棄し、ユーザーをサインアウトします。 このメソッドはログイン ページにもリダイレクトします。

CodeIgniterセッションビュー

application/views/sessionsに次のビューを作成します。

  • Dashboard.php
  • ログイン.php
  • settings.php

dashboard.phpに次のコードを追加します。

<!DOCTYPE html>
<html>
<head>
<title>Dashboard</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https:0
</head>
<body>
<div class="container">
<div class="column">
<nav class="navbar" role="navigation" aria-label="main navigation">
<div id="navbarBasicExample" class="navbar-menu">
<div class="navbar-start">
<a href="<?= site_url('dashboard')?>" class="navbar-item is-active">Dashboard</a>
<a href="<?= site_url('settings')?>" class="navbar-item">Settings</a>
</div>
 
<div class="navbar-end">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link"><?=$this->session->userdata(3);?></a>
 
<div class="navbar-dropdown">
<a class="navbar-item">My Profile</a>
<hr class="navbar-divider">
<a class="navbar-item">Sign out</a>
</div>
</div>
</div>
</div>
</nav>
<h3>Welcome Page</h3>
</div>
</div>
</body>
</html>

ここに、

session->userdata('username');?> 認証方法で設定したユーザー名が表示されます

login.phpに次のコードを追加します。

<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https:0
</head>
<body>
<div class="container">
<div class="column">
<p><?=$this->session->userdata(1);?></p>
<form method="post" action="<?= site_url('authenticate')?>">
<div class="field">
<label class="label">Username</label>
<div class="control">
<input class="input" type="text" placeholder="Text input">
</div>
</div>
<div class="field">
<label class="label">Password</label>
<div class="control">
<input class="input" type="password" placeholder="Text input">
</div>
</div>
<div class="field is-grouped">
<div class="control">
<button class="button is-success">Login</button>
</div>
</div>
</form>
</div>
</div>
</body>
</html>

ここに、

ログインフォームは認証ルートに送信されます。

次のコードをsettings.phpに追加します。

<!DOCTYPE html>
<html>
<head>
<title>Settings</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https:0
</head>
<body>
<div class="container">
<div class="column">
<nav class="navbar" role="navigation" aria-label="main navigation">
<div id="navbarBasicExample" class="navbar-menu">
<div class="navbar-start">
<a href="<?= site_url('dashboard')?>" class="navbar-item">Dashboard</a>
<a href="<?= site_url('settings')?>" class="navbar-item">Settings</a>
</div>
 
<div class="navbar-end">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Jim Jones</a>
 
<div class="navbar-dropdown">
<a href="#" class="navbar-item">My Profile</a>
<hr class="navbar-divider">
<a href="<?= site_url('logout')?>" class="navbar-item">Sign out</a>
</div>
</div>
</div>
</div>
</nav>
<h3>Settings Page</h3>
</div>
</div>
</body>
</html>

以上が私たちの見解です。それでは、アプリケーションのテストを行いましょう。

このチュートリアルでは、組み込みの PHP Web サーバーを使用していますが、PHP をサポートする任意の Web サーバーを使用できます。

ターミナルを開く

次のコマンドを実行します

cd C:\Sites\ci-app
php -S localhost:3000

ここに、

上記のコマンドは、アプリケーション コード ディレクトリを参照し、ポート 3000 で組み込みサーバーを起動します。

注:アプリケーションのパスは、ダウンロードした場所のパスと一致している必要があります。 CodeIgniterを使用する場合、コンピュータで空いているポート番号であればどれでも使用できます。ポート3000を使用する必要はありません。

以下を開きます URL ウェブブラウザで: http://localhost:3000/dashboard

次のページにリダイレクトされます

CodeIgniterセッションビュー

ログインボタンをクリック

以下の結果が表示されます

CodeIgniterセッションビュー

ログインすると、セッション データを確認できるようになります。

よくあるご質問

ユーザーデータは、設定を解除するかセッションが終了するまで、セッション全体を通して保持されます。フラッシュデータは一時的な値であり、次のリクエストまで保持された後、自動的に削除されます。これは、一度限りのメッセージに適しています。

Tempdata は、有効期限が設定されたセッション データです。mark_as_temp() または set_tempdata() を秒単位で有効期間を指定して呼び出すと、 CodeIgniterは、セッションがアクティブな状態であっても、その値を自動的に削除します。

デフォルトでは CodeIgniterは、サーバー上のファイルを使用してセッションを保存します。複数のサーバー間で共有ストレージが必要な場合は、設定ファイルでドライバをデータベース、Redis、またはMemcachedに切り替えることができます。

はい。AIはセッション設定をレビューして脆弱な設定を特定し、ログイン後にセッションIDを再生成すること、Cookieの暗号化を有効にすること、セッションハイジャックのリスクを軽減するためにHTTPS専用のCookieを使用することを推奨できます。

はい。簡単な説明から、AIはルーティング、セッションコントローラ、および保護されたビューを生成できます。AIのスキャフォールドはシミュレートされたチェックを使用することが多いため、必ず実際のデータベース検証とパスワードハッシュを追加してください。