Як налаштувати сеанс CodeЗапальник з прикладом

⚡ Розумний підсумок

CodeУправління сеансами Igniter зберігає дані користувачів через HTTP-запити без урахування стану, дозволяючи програмі запам'ятовувати зареєстрованого користувача, елементи кошика або одноразові флеш-повідомлення. У цьому прикладі створюється флеш-повідомлення та імітований вхід за допомогою... CodeБібліотека сеансів Igniter.

  • 🌐 Чому саме сесії: HTTP не зберігає стан, тому сесії зберігають дані користувача, такі як стан входу, в окремих запитах сторінок на сервері.
  • 🍪 Файли cookie проти сесій: Файли cookie зберігають невеликі дані на комп’ютері користувача, тоді як сеанси зберігають більші дані на сервері та безпечніші для конфіденційних значень.
  • 💨 Дані флеш-пам'яті: set_flashdata() зберігає повідомлення, доступне лише для наступного запиту, що ідеально підходить для одноразового зворотного зв'язку після перенаправлення.
  • 🔑 Дані користувача: set_userdata() зберігає такі значення, як username та logged_in, протягом усього сеансу, а unset_userdata() очищає їх після виходу з системи.
  • 🛡️ Управління доступом: Метод check_auth() для повторного використання перенаправляє відвідувачів на сторінку входу щоразу, коли відсутній ключ сеансу logged_in.
  • 🧪 Робочий приклад: У цьому навчальному посібнику представлено маршрутизацію проводів, контролер та представлення у стилі Bulma для демонстрації потоків як флеш-сеансів, так і постійних сеансів.
  • 🤖 AI Assist: Інструменти штучного інтелекту можуть створювати контролери сеансів, генерувати карти маршрутів та позначати небезпечну обробку сеансів перед розгортанням.

CodeКерування сеансом Igniter

CodeКерування сеансом Igniter

Якщо ви раніше розробляли настільні програми, то, ймовірно, знаєте, що можна визначити глобальну змінну, присвоїти їй значення та використовувати її протягом усього життєвого циклу програми. Відкриваючи та закриваючи більше однієї форми, кожен запит матиме доступ до глобальної змінної.

Іншими словами, стан програми зберігається. Тобто, якщо під час входу ви встановили назву компанії як глобальну змінну, то навіть після закриття форми входу цей стан назви компанії зберігається.

HTTP працює дещо інакше, ніж сценарій, який ми щойно описали. Він не має стану. Тобто, будь-які дії в одному запиті не зберігаються в наступному.

Щоб вирішити цю проблему, у нас є два (2) рішення в PHP. Ми можемо працювати або з файлами cookie, які є невеликими файлами, розміщеними на комп'ютері користувача, або з сесіями, які схожі на файли cookie, але зберігаються на сервері та мають більшу ємність, ніж файли cookie.

Коли використовувати сесії?

Сесії зазвичай корисні, коли ви хочете знати про дії користувача на кожній сторінці. Наприклад, припустимо, що у вас є захищена область на веб-сайті. Користувачам не потрібно входити в систему на кожній сторінці. Ви можете дозволити користувачеві увійти один раз і зберегти його дані в змінній сесії, а потім повторно використовувати ті ж дані для подальших запитів. Інші випадки використання включають роботу з магазином.ping система, і користувач має додавати товари до магазинуping візок.

В якості альтернативи, CodeIgniter також використовує сесії, щоб зробити дані доступними лише один раз під час наступного запиту. Це корисно, коли ви відредагували та оновили запис бази даних і хочете повернути користувачеві певний зворотний зв'язок, коли його перенаправляють на іншу сторінку.

Надсилання миттєвих повідомлень на інші сторінки за допомогою CI Sessions

У цьому розділі ви дізнаєтесь про надсилання миттєвих повідомлень на інші сторінки за допомогою бібліотеки сеансів у 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() {…} визначає метод індексу сеансу, який завантажує перегляд індексу сеансу.
  • публічна функція flash_message(){…} визначає метод флеш-повідомлення, який встановлює флеш-дані, а потім перенаправляє на маршрут flash_index

Давайте тепер створимо представлення, яке відображатиме значення даних сеансу.

Створіть новий каталог sessions у application/views

Створіть новий файл index.php у application/views/sessions

Додайте наступний код

<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

Надсилання миттєвих повідомлень на інші сторінки

Натисніть кнопку оновлення веб-браузера або натисніть F5

Тепер ви отримаєте такі результати

Надсилання миттєвих повідомлень на інші сторінки

Зберігання даних користувача в сесіях CI

Розглянемо трохи складніший приклад. Для спрощення ми будемо імітувати автентифікацію користувача, а не виконуватимемо фактичну реалізацію перевірки запису користувача в базі даних та наданого пароля.

Почнемо з маршрутів

Відкрийте routes.php у програмі/config

Додайте наступні маршрути

$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['settings'] = 'sessioncontroller/settings'; визначає захищену сторінку, яка має бути доступна лише користувачам, які ввійшли в систему
  • $route['dashboard'] = 'сеансовий контролер/панель інструментів'; визначає захищену сторінку, яка має бути доступна лише користувачам, які ввійшли в систему.
  • $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'));
}

ТУТ,

  • Публічна функція check_auth($page) {…} визначає метод, який перевіряє, чи користувач увійшов у систему, а потім дозволяє доступ до сторінки. Якщо користувач не увійшов у систему, його перенаправляють на сторінку входу з коротким повідомленням.
  • public function login() {…} завантажує вікно входу, розташоване в каталозі сесій.
  • публічна функція authenticate() {…} встановлює дані користувача сеансу для ключів logged_in та імені користувача. ПРИМІТКА. Ми не перевіряємо дані для входу в базу даних. Ми просто припускаємо, що подані деталі в порядку, і встановлюємо дані сеансу.
  • public function dashboard() {…} завантажує сторінку панелі інструментів після виклику $this->check_auth('dashboard');, яка перевіряє, чи встановлено ключ сеансу logged_in.
  • публічна функція settings() {…} завантажує сторінку налаштувань, яка також захищена
  • публічна функція logout() {…} знищує дані сеансу та виводить користувача з системи. Метод також перенаправляє на сторінку входу

CodeПерегляди сеансу Igniter

Створіть наступні подання в програмі/поданнях/сесіях

  • dashboard.php
  • login.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, але ви можете використовувати будь-який веб-сервер, який підтримує PHP.

Відкрийте термінал

Виконайте наступну команду

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

ТУТ,

Наведена вище команда переходить до каталогу коду програми та запускає вбудований сервер на порту 3000.

Примітка: шлях до програми має збігатися зі шляхом завантаження CodeIgniter, і ви можете використовувати будь-який вільний порт на вашому комп'ютері. Необов'язково використовувати порт 3000.

Відкрийте наступне URL у вашому веббраузері: http://localhost:3000/dashboard

Ви будете перенаправлені на наступну сторінку

CodeПерегляди сеансу Igniter

Натисніть на кнопку Вхід

Ви побачите такі результати

CodeПерегляди сеансу Igniter

Після того, як ми ввійшли, ми тепер можемо побачити дані сеансу.

Поширені запитання

Дані користувача зберігаються протягом усього сеансу, доки ви не скинете їх або сеанс не завершиться. Flashdata – це тимчасове значення, яке зберігається лише після наступного запиту, а потім автоматично видаляється, що підходить для одноразових повідомлень.

Тимчасові дані – це дані сеансу з встановленим часом закінчення терміну дії. Ви викликаєте mark_as_temp() або set_tempdata() з часом дії в секундах, після чого CodeIgniter автоматично видаляє значення, навіть якщо сеанс все ще активний.

За замовчуванням CodeIgniter зберігає сесії за допомогою файлів на сервері. Ви можете переключити драйвер на базу даних, Redis або Memcached у конфігураційному файлі, якщо вам потрібне спільне сховище на кількох серверах.

Так. Штучний інтелект може перевірити конфігурацію вашого сеансу на наявність слабких налаштувань, рекомендувати повторно створити ідентифікатор сеансу після входу, увімкнути шифрування файлів cookie та використовувати файли cookie лише HTTPS для зменшення ризиків захоплення сеансу.

Так. З короткого опису, ШІ може створювати маршрути, контролер сеансу та захищені представлення. Завжди додавайте реальну перевірку бази даних та хешування паролів, оскільки скелети ШІ часто використовують імітовані перевірки.

Підсумуйте цей пост за допомогою: