Jak ustawić sesję w CodeZapłonnik z przykładem

⚡ Inteligentne podsumowanie

CodeZarządzanie sesjami Igniter przechowuje dane użytkownika w bezstanowych żądaniach HTTP, umożliwiając aplikacji zapamiętanie zalogowanego użytkownika, pozycji w koszyku lub jednorazowych wiadomości flash. Ten przykład tworzy komunikaty flash i symulowane logowanie przy użyciu CodeBiblioteka sesji Igniter.

  • 🌐 Dlaczego sesje: Protokół HTTP jest bezstanowy, więc sesje zachowują dane użytkownika, takie jak stan logowania, w oddzielnych żądaniach stron na serwerze.
  • 🍪 Pliki cookie a sesje: Pliki cookie przechowują niewielkie ilości danych na komputerze użytkownika, natomiast sesje przechowują większe dane na serwerze i są bezpieczniejsze w przypadku wrażliwych wartości.
  • 💨 Dane Flash: set_flashdata() przechowuje wiadomość dostępną dopiero przy następnym żądaniu, co jest idealnym rozwiązaniem w przypadku jednorazowego przekazania informacji zwrotnej po przekierowaniu.
  • 🔑 Dane użytkownika: set_userdata() zapisuje wartości takie jak username i logged_in przez całą sesję, natomiast unset_userdata() czyści je po wylogowaniu.
  • 🛡️ Kontrola dostępu: Wielokrotnego użytku metoda check_auth() przekierowuje użytkowników na stronę logowania za każdym razem, gdy brakuje klucza sesji logged_in.
  • 🧪 Przykład działania: W samouczku przedstawiono trasy, kontroler i widoki w stylu Bulma, aby zademonstrować przepływy sesji zarówno flash, jak i trwałych.
  • 🤖 Asystent AI: Narzędzia AI mogą wspierać kontrolery sesji, generować mapy tras i oznaczać niebezpieczne operacje związane z obsługą sesji przed wdrożeniem.

CodeZarządzanie sesjami Igniter

CodeZarządzanie sesjami Igniter

Jeśli tworzyłeś już aplikacje desktopowe, prawdopodobnie wiesz, że możesz zdefiniować zmienną globalną, przypisać jej wartość i używać jej przez cały cykl życia aplikacji. Otwierając i zamykając więcej niż jeden formularz, każde żądanie będzie miało dostęp do zmiennej globalnej.

Innymi słowy, stan aplikacji jest zachowany. Oznacza to, że jeśli podczas logowania ustawisz nazwę firmy jako zmienną globalną, to nawet po zamknięciu formularza logowania stan nazwy firmy zostanie zachowany.

Protokół HTTP działa nieco inaczej niż scenariusz, który właśnie opisaliśmy. Jest bezstanowy. Oznacza to, że cokolwiek zrobisz w jednym żądaniu, nie zostanie zapisane w kolejnym.

Aby obejść ten problem, mamy dwa (2) rozwiązania w PHP. Możemy albo pracować z plikami cookie, które są małymi plikami umieszczanymi na komputerze użytkownika, albo z sesjami, które są podobne do plików cookie, ale są przechowywane na serwerze i mają większą pojemność niż pliki cookie.

Kiedy stosować sesje?

Sesje są zazwyczaj przydatne, gdy chcesz poznać aktywność użytkownika na poszczególnych stronach. Załóżmy na przykład, że masz chroniony obszar na stronie internetowej. Użytkownicy nie muszą się logować na każdej stronie. Możesz pozwolić użytkownikowi zalogować się raz i zapisać jego dane w zmiennej sesji, a następnie ponownie wykorzystać te same dane w kolejnych żądaniach. Inne przypadki użycia obejmują pracę nad sklepem.ping system i użytkownik musi dodać przedmioty do sklepuping wózek.

Alternatywnie CodeIgniter wykorzystuje również sesje, aby dane były dostępne tylko raz przy kolejnym żądaniu. Jest to przydatne, gdy edytowałeś i aktualizowałeś rekord w bazie danych i chcesz zwrócić użytkownikowi informację zwrotną po przekierowaniu na inną stronę.

Wysyłanie wiadomości Flash na inne strony z sesjami CI

W tej sekcji dowiesz się o wysyłaniu wiadomości flash na inne strony przy użyciu biblioteki sesji CodeZapalnik.

Utwórz nowy plik SessionController w

application/controllers/SessionController.php

Dodaj następujący kod

<?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'));
}
}

TUTAJ,

  • class SessionController rozszerza CI_Controller {…} definiuje klasę SessionController i rozszerza klasę kontrolera nadrzędnego.
  • funkcja publiczna __construct() {…} definiuje metodę konstruktora, która inicjuje klasę nadrzędną i ładuje pomocnika adresu URL oraz bibliotekę sesji.
  • funkcja publiczna indeks() {…} definiuje metodę indeksu sesji, która ładuje widok indeksu sesji.
  • funkcja publiczna flash_message(){…} definiuje metodę wiadomości flash, która ustawia dane flash, a następnie przekierowuje do trasy flash_index

Utwórzmy teraz widok, który będzie wyświetlał wartość danych sesji.

Utwórz nowy katalog sesji w aplikacji/widoki

Utwórz nowy plik indeks.php w aplikacji/views/sessions

Dodaj następujący kod

<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>

TUTAJ,

session->userdata('msg');?> pobiera wartość danych sesji o kluczu msg i wyświetla ją w przeglądarce.

Stwórzmy teraz trasy dla naszej metody flashowania sesji

Otwórz aplikację/config/routes.php

Dodaj następujące wiersze

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

Uruchommy teraz wbudowany serwer dla PHP i przetestuj nasze wiadomości flash

Otwórz terminal

Uruchom następujące polecenie

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

TUTAJ,

Powyższe polecenie powoduje przejście do katalogu z kodem aplikacji i uruchomienie wbudowanego serwera na porcie 3000.

Uwaga: ścieżka aplikacji musi być taka sama, jak ścieżka, do której ją pobrano CodeIgniter i możesz użyć dowolnego numeru portu, który jest wolny na Twoim komputerze. Nie musisz używać portu 3000.

Załaduj następujące URL w Twojej przeglądarce internetowej: http://localhost:3000/flash_message

Zostaniesz przekierowany do następującego miejsca URL, a otrzymasz następujące wyniki: http://localhost:3000/flash_index

Wysyłanie wiadomości Flash na inne strony

Kliknij przycisk odświeżania przeglądarki internetowej lub naciśnij klawisz F5

Teraz otrzymasz następujące wyniki

Wysyłanie wiadomości Flash na inne strony

Przechowywanie danych użytkownika w sesjach CI

Przyjrzyjmy się teraz nieco bardziej zaawansowanemu przykładowi. Dla uproszczenia, zasymulujemy uwierzytelnianie użytkownika, a nie będziemy przeprowadzać faktycznej implementacji weryfikacji rekordu użytkownika w bazie danych i przesłanego hasła.

Zacznijmy od tras

Otwórz Routes.php znajdujący się w application/config

Dodaj następujące trasy

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

TUTAJ,

  • $route['login'] = 'kontroler sesji/logowanie'; definiuje trasę wyświetlającą formularz logowania
  • $route['authenticate'] = 'kontroler sesji/uwierzytelnij'; definiuje trasę symulującą pomyślne logowanie użytkownika i ustawia dane logowania do sesji.
  • $route['ustawienia'] = 'kontroler sesji/ustawienia'; definiuje chronioną stronę, która powinna być dostępna tylko dla zalogowanych użytkowników
  • $route['pulpit nawigacyjny'] = 'kontroler sesji/panel kontrolny'; definiuje chronioną stronę, która powinna być dostępna tylko dla zalogowanych użytkowników.
  • $route['logout'] = 'kontroler sesji/wylogowanie'; wylogowuje użytkownika niszcząc dane sesji

Zaktualizujmy teraz SessionController

Otwórz aplikację/kontrolery/SessionController.php

Dodaj następujące metody

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'));
}

TUTAJ,

  • Funkcja publiczna check_auth($page) {…} definiuje metodę, która sprawdza, czy użytkownik jest zalogowany, a następnie zezwala na dostęp do strony. Jeśli użytkownik nie jest zalogowany, zostaje przekierowany na stronę logowania za pomocą komunikatu flash.
  • publiczna funkcja login() {…} ładuje widok logowania znajdujący się w katalogu sesji.
  • public function authenticate() {…} ustawia dane użytkownika sesji dla kluczy signed_in i username. UWAGA: Nie weryfikujemy żadnych danych logowania w bazie danych. Po prostu zakładamy, że przesłane dane są poprawne i ustawiamy dane sesji.
  • publiczna funkcja dashboard() {…} ładuje stronę pulpitu nawigacyjnego po wywołaniu $this->check_auth('dashboard');, co weryfikuje, czy klucz sesji logged_in jest ustawiony.
  • funkcja publiczna settings() {…} ładuje stronę ustawień, która jest również chroniona
  • funkcja publiczna logout() {…} niszczy dane sesji i wylogowuje użytkownika. Metoda przekierowuje również na stronę logowania

CodeWidoki sesji Igniter

Utwórz następujące widoki w aplikacji/widoki/sesje

  • deska rozdzielcza.php
  • login.php
  • settings.php

Dodaj następujący kod do 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>

TUTAJ,

session->userdata('username');?> wyświetla nazwę użytkownika, którą ustawiliśmy w metodzie uwierzytelniania

Dodaj następujący kod do 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>

TUTAJ,

Formularz logowania przechodzi do ścieżki uwierzytelniania.

Dodaj następujący kod do 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>

To tyle, jeśli chodzi o nasze widoki. Teraz przetestujmy naszą aplikację.

W tym samouczku używamy wbudowanego serwera WWW PHP, ale możesz użyć dowolnego serwera WWW obsługującego PHP.

Otwórz terminal

Uruchom następujące polecenie

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

TUTAJ,

Powyższe polecenie powoduje przejście do katalogu z kodem aplikacji i uruchomienie wbudowanego serwera na porcie 3000.

Uwaga: ścieżka aplikacji musi być taka sama, jak ścieżka, do której ją pobrano CodeIgniter i możesz użyć dowolnego numeru portu, który jest wolny na Twoim komputerze. Nie musisz używać portu 3000.

Otwórz następujące URL w Twojej przeglądarce internetowej: http://localhost:3000/dashboard

Zostaniesz przekierowany na następującą stronę

CodeWidoki sesji Igniter

Kliknij przycisk Zaloguj

Zobaczysz następujące wyniki

CodeWidoki sesji Igniter

Po zalogowaniu możemy już zobaczyć dane sesji.

FAQ

Dane użytkownika są zachowywane przez całą sesję, aż do ich wyłączenia lub wygaśnięcia. Flashdata to wartość tymczasowa, która jest zachowywana tylko po kolejnym żądaniu, a następnie jest automatycznie usuwana, co jest przydatne w przypadku wiadomości jednorazowych.

Tempdata to dane sesji z ustalonym czasem wygaśnięcia. Wywołujesz funkcję mark_as_temp() lub set_tempdata() z czasem życia w sekundach, po którym CodeIgniter automatycznie usuwa wartość, nawet jeśli sesja jest nadal aktywna.

Domyślnie CodeIgniter przechowuje sesje za pomocą plików na serwerze. Możesz przełączyć sterownik na bazę danych, Redis lub Memcached w pliku konfiguracyjnym, jeśli potrzebujesz współdzielonej pamięci masowej na wielu serwerach.

Tak. Sztuczna inteligencja może przejrzeć konfigurację sesji pod kątem słabych ustawień, zalecić ponowne wygenerowanie identyfikatora sesji po zalogowaniu, włączenie szyfrowania plików cookie i korzystanie z plików cookie obsługujących wyłącznie protokół HTTPS w celu ograniczenia ryzyka przejęcia sesji.

Tak. Z krótkiego opisu wynika, że ​​AI może wygenerować trasy, kontroler sesji i chronione widoki. Zawsze należy dodawać rzeczywistą weryfikację bazy danych i haszowanie haseł, ponieważ szkielety sztucznej inteligencji często korzystają z symulowanych kontroli.

Podsumuj ten post następująco: