كيفية إعداد الجلسة في Codeمشعل مع مثال

⚡ ملخص ذكي

Codeتُخزّن إدارة جلسات Igniter بيانات المستخدم عبر طلبات HTTP عديمة الحالة، مما يسمح للتطبيق بتذكر المستخدم المُسجّل دخوله، أو عناصر سلة التسوق، أو رسائل التنبيه لمرة واحدة. يُنشئ هذا المثال رسائل تنبيه وتسجيل دخول مُحاكى باستخدام Codeمكتبة جلسات Igniter.

  • 🌐 لماذا الجلسات؟ بروتوكول HTTP عديم الحالة، لذا تحتفظ الجلسات ببيانات المستخدم مثل حالة تسجيل الدخول عبر طلبات الصفحات المنفصلة على الخادم.
  • 🍪 ملفات تعريف الارتباط مقابل الجلسات: تقوم ملفات تعريف الارتباط بتخزين بيانات صغيرة على جهاز المستخدم، بينما تقوم الجلسات بتخزين بيانات أكبر على الخادم وتكون أكثر أمانًا للقيم الحساسة.
  • ؟؟؟؟ بيانات الفلاش: تقوم الدالة set_flashdata() بتخزين رسالة متاحة فقط في الطلب التالي، وهي مثالية لتقديم ملاحظات لمرة واحدة بعد إعادة التوجيه.
  • 🔑 بيانات المستخدم: تقوم الدالة set_userdata() بالاحتفاظ بقيم مثل اسم المستخدم و logged_in طوال الجلسة، وتقوم الدالة unset_userdata() بمسحها عند تسجيل الخروج.
  • 🛡️ صلاحية التحكم صلاحية الدخول: تقوم طريقة check_auth() القابلة لإعادة الاستخدام بإعادة توجيه الزوار إلى صفحة تسجيل الدخول كلما كان مفتاح جلسة logged_in مفقودًا.
  • 🧪 مثال العمل: يقوم البرنامج التعليمي بتوصيل المسارات ووحدة التحكم وعرضها بأسلوب Bulma لتوضيح كل من تدفقات الجلسات السريعة والمستمرة.
  • 🤖 مساعدة الذكاء الاصطناعي: يمكن لأدوات الذكاء الاصطناعي إنشاء وحدات تحكم الجلسات، وتوليد خرائط التوجيه، والإشارة إلى معالجة الجلسات غير الآمنة قبل النشر.

Codeإدارة جلسات Igniter

Codeإدارة جلسات Igniter

إذا سبق لك تطوير تطبيقات سطح المكتب، فربما تعلم أنه يمكنك تعريف متغير عام، وتعيين قيمة له، واستخدامه طوال دورة حياة التطبيق. عند فتح وإغلاق أكثر من نموذج، سيتمكن كل طلب من الوصول إلى المتغير العام.

بمعنى آخر، يتم الحفاظ على حالة التطبيق. أي أنه إذا قمتَ عند تسجيل الدخول بتعيين اسم الشركة إلى متغير عام، فسيتم الاحتفاظ بحالة اسم الشركة حتى بعد إغلاق نافذة تسجيل الدخول.

يعمل بروتوكول HTTP بشكل مختلف قليلاً عن السيناريو الذي وصفناه للتو. فهو عديم الحالة. بمعنى آخر، أي شيء تفعله في طلب واحد لا يبقى في الطلب التالي.

للتغلب على هذه المشكلة، لدينا حلان في لغة PHP. يمكننا إما استخدام ملفات تعريف الارتباط، وهي ملفات صغيرة تُخزَّن على جهاز المستخدم، أو استخدام الجلسات، وهي مشابهة لملفات تعريف الارتباط ولكنها تُخزَّن على الخادم ولها سعة أكبر.

متى تستخدم الجلسات؟

تُعدّ الجلسات مفيدةً عادةً عندما ترغب في معرفة أنشطة المستخدم من صفحةٍ إلى أخرى. على سبيل المثال، لنفترض أن لديك منطقةً محميةً على الموقع الإلكتروني. لا يحتاج المستخدمون إلى تسجيل الدخول في كل صفحة. يمكنك السماح للمستخدم بتسجيل الدخول مرةً واحدةً وتخزين بياناته في متغير جلسة، ثم إعادة استخدام البيانات نفسها في الطلبات اللاحقة. تشمل حالات الاستخدام الأخرى العمل على متجر.ping النظام ويتعين على المستخدم إضافة عناصر إلى المتجرping عربة التسوق.

بدلا من ذلك، Codeيستخدم Igniter أيضًا الجلسات لجعل البيانات متاحة مرة واحدة فقط عند الطلب التالي. يُعد هذا مفيدًا عند تعديل سجل قاعدة البيانات وتحديثه، والرغبة في إرسال بعض الملاحظات للمستخدم عند إعادة توجيهه إلى صفحة أخرى.

إرسال رسائل فلاش إلى صفحات أخرى مع جلسات CI

ستتعرف في هذا القسم على كيفية إرسال رسائل فلاش إلى صفحات أخرى باستخدام مكتبة الجلسة الموجودة 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'));
}
}

هنا،

  • تحدد فئة SessionController CI_Controller {...} فئة SessionController وتوسع فئة وحدة التحكم الأصلية.
  • تحدد الوظيفة العامة __construct() {...} طريقة المُنشئ التي تقوم بتهيئة الفئة الأصلية، وتحميل مساعد url ومكتبة الجلسة.
  • يحدد فهرس الوظيفة العامة () {...} طريقة فهرس الجلسة التي تقوم بتحميل عرض فهرس الجلسة.
  • تحدد الوظيفة العامة flash_message(){…} طريقة رسالة الفلاش التي تقوم بتعيين بيانات الفلاش ثم تعيد التوجيه إلى مسار flash_index

لنقم الآن بإنشاء العرض الذي سيعرض قيمة بيانات الجلسة.

أنشئ مجلدًا جديدًا باسم sessions في application/views

قم بإنشاء ملف 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 ويعرضها في المتصفح.

لنقم الآن بإنشاء مسارات لطريقة فلاش الجلسة الخاصة بنا

افتح التطبيق/config/routes.php

أضف الأسطر التالية

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

لنبدأ الآن تشغيل الخادم المدمج لـ PHP واختبار رسائل الفلاش لدينا

افتح المحطة

قم بتشغيل الأمر التالي

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

هنا،

يتصفح الأمر أعلاه دليل رمز التطبيق ويبدأ تشغيل الخادم المدمج على المنفذ 3000.

ملاحظة: يجب أن يتطابق مسار التطبيق مع المسار الذي قمت بتنزيله منه Codeباستخدام برنامج Igniter، يمكنك استخدام أي رقم منفذ متاح على جهاز الكمبيوتر الخاص بك. ليس من الضروري استخدام المنفذ 3000.

قم بتحميل ما يلي URL في متصفح الويب الخاص بك: http://localhost:3000/flash_message

سيتم تحويلك إلى ما يلي URLوستحصل على النتائج التالية: http://localhost:3000/flash_index

إرسال رسائل فلاش إلى صفحات أخرى

انقر فوق زر التحديث في متصفح الويب الخاص بك أو اضغط على F5

سوف تحصل الآن على النتائج التالية

إرسال رسائل فلاش إلى صفحات أخرى

تخزين بيانات المستخدم في جلسات CI

لنلقِ نظرة الآن على مثال أكثر تقدماً. ولتبسيط الأمر، سنحاكي عملية مصادقة المستخدم ولن نقوم بالتنفيذ الفعلي للتحقق من سجل المستخدم في قاعدة البيانات وكلمة المرور المُدخلة.

لنبدأ بالطرق

افتح Routes.php الموجود في التطبيق/التكوين

أضف المسارات التالية

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

هنا،

  • $route['login'] = 'sessioncontroller/login'; يحدد المسار الذي يعرض نموذج تسجيل الدخول
  • $route['authenticate'] = 'وحدة تحكم الجلسة/المصادقة'; يحدد المسار الذي يحاكي تسجيل دخول المستخدم الناجح ويحدد بيانات تسجيل الدخول للجلسة.
  • $route['settings'] = 'وحدة تحكم الجلسة/الإعدادات'; يحدد صفحة محمية يجب أن تكون متاحة فقط للمستخدمين الذين قاموا بتسجيل الدخول
  • $route['dashboard'] = 'وحدة تحكم الجلسة/لوحة المعلومات'; يحدد صفحة محمية يجب أن تكون متاحة فقط للمستخدمين الذين قاموا بتسجيل الدخول.
  • $route['logout'] = 'وحدة تحكم الجلسة/تسجيل الخروج'; يقوم بتسجيل خروج المستخدم عن طريق تدمير بيانات الجلسة

لنقم الآن بتحديث وحدة التحكم في الجلسة

افتح التطبيق/وحدات التحكم/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'));
}

هنا،

  • تُعرّف الدالة العامة `check_auth($page) {…}` الدالة التي تتحقق مما إذا كان المستخدم قد سجّل دخوله، ثم تسمح له بالوصول إلى الصفحة. إذا لم يكن المستخدم مسجلاً دخوله، فسيتم توجيهه إلى صفحة تسجيل الدخول مع رسالة تنبيه.
  • public function login() {…} تقوم بتحميل عرض تسجيل الدخول الموجود في دليل الجلسات.
  • تحدد الدالة public function authenticate() {…} بيانات مستخدم الجلسة للمفاتيح logged_in وusername. ملاحظة: لا نقوم بالتحقق من أي تفاصيل تسجيل دخول مقابل قاعدة البيانات. نفترض ببساطة أن التفاصيل المرسلة صحيحة ونقوم بتعيين بيانات الجلسة.
  • تقوم الدالة العامة dashboard() {…} بتحميل صفحة لوحة التحكم بعد استدعاء $this->check_auth('dashboard'); والتي تتحقق من تعيين مفتاح جلسة logged_in.
  • تقوم الدالة العامة settings() {…} بتحميل صفحة الإعدادات، وهي محمية أيضًا.
  • تقوم الوظيفة العامة logout() {…} بتدمير بيانات الجلسة وتسجيل خروج المستخدم. تقوم الطريقة أيضًا بإعادة التوجيه إلى صفحة تسجيل الدخول

Codeعرض جلسة Igniter

قم بإنشاء العروض التالية في application/views/sessions

  • لوحة القيادة. php
  • login.php
  • settings.php

أضف الكود التالي إلى ملف dash.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>

هنا،

جلسة -> بيانات المستخدم ('اسم المستخدم')؛؟> تعرض اسم المستخدم الذي قمنا بتعيينه في طريقة المصادقة

أضف الكود التالي إلى 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 المدمج، ولكن يمكنك استخدام أي خادم ويب يدعم PHP.

افتح المحطة

قم بتشغيل الأمر التالي

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

هنا،

يتصفح الأمر أعلاه دليل رمز التطبيق ويبدأ تشغيل الخادم المدمج على المنفذ 3000.

ملاحظة: يجب أن يتطابق مسار التطبيق مع المسار الذي قمت بتنزيله منه Codeباستخدام برنامج Igniter، يمكنك استخدام أي رقم منفذ متاح على جهاز الكمبيوتر الخاص بك. ليس من الضروري استخدام المنفذ 3000.

افتح ما يلي URL في متصفح الويب الخاص بك: http://localhost:3000/dashboard

سيتم تحويلك إلى الصفحة التالية

Codeعرض جلسة Igniter

انقر فوق زر تسجيل الدخول

سوف ترى النتائج التالية

Codeعرض جلسة Igniter

بعد أن قمنا بتسجيل الدخول، أصبحنا الآن قادرين على رؤية بيانات الجلسة.

الأسئلة الشائعة

تبقى بيانات المستخدم محفوظة طوال الجلسة حتى تقوم بإلغاء تعيينها أو تنتهي صلاحية الجلسة. أما بيانات الفلاش فهي قيمة مؤقتة تبقى حتى الطلب التالي مباشرةً ثم تُحذف تلقائيًا، وهي مناسبة للرسائل التي تُستخدم لمرة واحدة.

البيانات المؤقتة هي بيانات جلسة ذات مدة صلاحية محددة. يمكنك استدعاء الدالة mark_as_temp() أو set_tempdata() مع تحديد مدة صلاحية بالثواني، وبعدها Codeيقوم برنامج Igniter بإزالة القيمة تلقائيًا، حتى لو كانت الجلسة لا تزال نشطة.

افتراضيا Codeيخزن Igniter الجلسات باستخدام ملفات على الخادم. يمكنك تغيير برنامج التشغيل إلى قاعدة بيانات أو Redis أو Memcached في ملف التكوين عندما تحتاج إلى مساحة تخزين مشتركة عبر عدة خوادم.

نعم. يمكن للذكاء الاصطناعي مراجعة إعدادات جلستك بحثًا عن الإعدادات الضعيفة، والتوصية بإعادة إنشاء معرف الجلسة بعد تسجيل الدخول، وتمكين تشفير ملفات تعريف الارتباط، واستخدام ملفات تعريف الارتباط الخاصة بـ HTTPS فقط لتقليل مخاطر اختطاف الجلسة.

نعم. من خلال وصف موجز، يمكن للذكاء الاصطناعي إنشاء المسارات، ووحدة تحكم الجلسة، والواجهات المحمية. يُنصح دائمًا بإضافة التحقق من قاعدة البيانات الحقيقية وتشفير كلمات المرور، لأن نماذج الذكاء الاصطناعي غالبًا ما تستخدم عمليات تحقق محاكاة.

تلخيص هذه التدوينة بـ: