Istunnon asettaminen sisään CodeSytytin esimerkin kanssa

⚡ Älykäs yhteenveto

CodeIgniter Session Management tallentaa käyttäjätietoja tilattomien HTTP-pyyntöjen kautta, jolloin sovellus muistaa kirjautuneen käyttäjän, ostoskorin tuotteet tai kertaluonteiset flash-viestit. Tässä esimerkissä luodaan flash-viestit ja simuloitu kirjautuminen käyttämällä CodeIgniter-istuntokirjasto.

  • 🌐 Miksi istunnot: HTTP on tilaton, joten istunnot säilyttävät käyttäjätiedot, kuten kirjautumistilan, eri sivupyyntöjen välillä palvelimella.
  • 🍪 Evästeet vs. istunnot: Evästeet tallentavat pieniä tietoja käyttäjän tietokoneelle, kun taas istunnot tallentavat suurempia tietoja palvelimelle ja ovat turvallisempia arkaluonteisten arvojen säilyttämiseksi.
  • 💨 Flash-tiedot: set_flashdata() tallentaa viestin, joka on saatavilla vain seuraavassa pyynnössä, mikä on ihanteellista kertaluonteiseen palautteeseen uudelleenohjauksen jälkeen.
  • 🔑 Käyttäjätiedot: set_userdata() säilyttää arvot, kuten username ja logged_in, koko istunnon ajan, ja unset_userdata() tyhjentää ne uloskirjautumisen yhteydessä.
  • 🛡️ Kulunvalvonta: Uudelleenkäytettävä check_auth()-metodi ohjaa kävijät kirjautumissivulle aina, kun logged_in-istuntoavain puuttuu.
  • 🧪 Työesimerkki: Tutoriaali yhdistää reitit, ohjaimen ja Bulma-tyyliset näkymät sekä flash- että pysyvien istuntojen työnkulkujen havainnollistamiseksi.
  • 🤖 AI Assist: Tekoälytyökalut voivat tukea istunto-ohjaimia, luoda reittikarttoja ja merkitä suojaamattomia istuntojen käsittelyjä ennen käyttöönottoa.

CodeSytyttimen istuntojen hallinta

CodeSytyttimen istuntojen hallinta

Jos olet aiemmin kehittänyt työpöytäsovelluksia, tiedät luultavasti, että voit määritellä globaalin muuttujan, antaa sille arvon ja käyttää sitä koko sovelluksen elinkaaren ajan. Useamman kuin yhden lomakkeen avaaminen ja sulkeminen tuo jokaiselle pyynnölle pääsyn globaaliin muuttujaan.

Toisin sanoen sovelluksen tila säilyy. Eli jos kirjautumisen yhteydessä asetit yrityksen nimen globaaliksi muuttujaksi, yrityksen nimen tila säilyy myös kirjautumislomakkeen sulkemisen jälkeen.

HTTP toimii hieman eri tavalla kuin juuri kuvailemamme skenaarion mukaisesti. Se on tilaton. Toisin sanoen yhdessä pyynnössä tekemäsi muutokset eivät säily seuraavassa pyynnössä.

Tämän ongelman kiertämiseksi PHP:ssä on kaksi (2) ratkaisua. Voimme joko työskennellä evästeiden, jotka ovat käyttäjän tietokoneelle tallennettuja pieniä tiedostoja, tai istuntojen, kanssa, jotka ovat evästeiden kaltaisia, mutta tallennetaan palvelimelle ja joiden kapasiteetti on suurempi kuin evästeillä.

Milloin istuntoja käytetään?

Istunnoista on yleensä hyötyä, kun haluat tietää käyttäjän toiminnan sivulta toiselle. Oletetaan esimerkiksi, että verkkosivustolla on suojattu alue. Käyttäjien ei tarvitse kirjautua sisään jokaisella sivulla. Voit antaa käyttäjän kirjautua sisään kerran ja tallentaa tietonsa istuntomuuttujaan, ja käyttää sitten samoja tietoja uudelleen tulevissa pyynnöissä. Muita käyttötapauksia ovat esimerkiksi verkkokaupan työstäminen.ping järjestelmään ja käyttäjän on lisättävä tuotteita kauppaanping koriin.

Vaihtoehtoisesti CodeIgniter käyttää myös istuntoja asettaakseen tiedot saataville vain kerran seuraavassa pyynnössä. Tästä on hyötyä, kun olet muokannut ja päivittänyt tietokantatietuetta ja haluat antaa käyttäjälle palautetta, kun hänet ohjataan toiselle sivulle.

Flash-viestien lähettäminen muille sivuille CI-istunnoilla

Tässä osiossa opit lähettämään flash-viestejä muille sivuille istuntokirjaston avulla Codesytytin.

Luo uusi tiedosto SessionController sisään

application/controllers/SessionController.php

Lisää seuraava koodi

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

TÄSSÄ,

  • luokka SessionController laajentaa CI_Controller {…} määrittää SessionController-luokan ja laajentaa pääohjainluokkaa.
  • public function __construct() {…} määrittää konstruktorimenetelmän, joka alustaa emoluokan ja lataa url-apuohjelman ja istuntokirjaston.
  • public function index() {…} määrittää istuntoindeksimenetelmän, joka lataa istuntoindeksinäkymän.
  • julkinen funktio flash_message(){…} määrittää flash-viestimenetelmän, joka asettaa flash-tiedot ja ohjaa sitten flash_index-reitille

Luodaan nyt näkymä, joka näyttää istuntotietojen arvon.

Luo uusi hakemisto istunnot sovelluksessa/näkymät

Luo uusi tiedosto index.php kohtaan application/views/sessions

Lisää seuraava koodi

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

TÄSSÄ,

session->userdata('msg');?> hakee msg-avaimella varustetun istuntodatan arvon ja näyttää sen selaimessa.

Luodaan nyt reitit istunto-flash-metodillemme

Avaa application/config/routes.php

Lisää seuraavat rivit

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

Käynnistetään nyt sisäänrakennettu palvelin PHP ja testaa flash-viestejämme

Avaa terminaali

Suorita seuraava komento

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

TÄSSÄ,

Yllä oleva komento selaa sovelluskoodihakemistoon ja käynnistää sisäänrakennetun palvelimen portissa 3000.

Huomautus: sovelluksen polun on vastattava polkua, josta latasit tiedoston. CodeIgniter, ja voit käyttää mitä tahansa tietokoneellasi vapaana olevaa porttinumeroa. Portin 3000 käyttö ei ole välttämätöntä.

Lataa seuraavat URL verkkoselaimessasi: http://localhost:3000/flash_message

Sinut ohjataan seuraavaan URL, ja saat seuraavat tulokset: http://localhost:3000/flash_index

Flash-viestien lähettäminen muille sivuille

Napsauta selaimesi päivityspainiketta tai paina F5

Saat nyt seuraavat tulokset

Flash-viestien lähettäminen muille sivuille

Käyttäjätietojen tallentaminen CI-istuntoihin

Tarkastellaan nyt hieman edistyneempää esimerkkiä. Yksinkertaisuuden vuoksi simuloimme käyttäjän todennusta emmekä tee varsinaista toteutusta, jossa tarkistetaan käyttäjätietue tietokannassa ja annettu salasana.

Aloitetaanpa reiteistä

Avaa routes.php, joka sijaitsee sovelluksessa/config

Lisää seuraavat reitit

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

TÄSSÄ,

  • $route['login'] = 'istunnonohjain/kirjautuminen'; määrittää reitin, joka näyttää kirjautumislomakkeen
  • $route['authenticate'] = 'istunnonohjain/todennus'; määrittää reitin, joka simuloi onnistunutta käyttäjän kirjautumista ja asettaa istunnon kirjautumistiedot.
  • $route['settings'] = 'istunnonohjain/asetukset'; määrittää suojatun sivun, jonka pitäisi olla vain kirjautuneiden käyttäjien käytettävissä
  • $route['dashboard'] = 'sessioncontroller/dashboard'; määrittää suojatun sivun, jonka pitäisi olla vain kirjautuneiden käyttäjien käytettävissä.
  • $route['logout'] = 'sessioncontroller/logout'; kirjaa käyttäjän ulos tuhoamalla istuntotiedot

Päivitetään nyt SessionController

Avaa application/controllers/SessionController.php

Lisää seuraavat menetelmät

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

TÄSSÄ,

  • public function check_auth($page) {…} määrittää metodin, joka tarkistaa, onko käyttäjä kirjautunut sisään, ja sallii sitten pääsyn sivulle. Jos käyttäjä ei ole kirjautunut sisään, hänet ohjataan kirjautumissivulle flash-viestillä.
  • public function login() {…} lataa istuntohakemistossa olevan kirjautumisnäkymän.
  • public function authenticate() {…} asettaa istunnon käyttäjätiedot avaimille logged_in ja username. HUOMAA: Emme tarkista kirjautumistietoja tietokantaan. Oletamme yksinkertaisesti, että lähetetyt tiedot ovat kunnossa ja asetamme istuntotiedot.
  • public function dashboard() {…} lataa dashboard-sivun kutsuttuaan $this->check_auth('dashboard'); -funktiota, joka varmistaa, että logged_in-istuntoavain on asetettu.
  • public function settings() {…} lataa asetussivun, joka on myös suojattu
  • public function logout() {…} tuhoaa istuntotiedot ja kirjaa käyttäjän ulos. Menetelmä ohjaa myös kirjautumissivulle

CodeIgniter-istunnon katselukerrat

Luo seuraavat näkymät sovelluksissa/näkymissä/istunnoissa

  • dashboard.php
  • login.php
  • settings.php

Lisää seuraava koodi dashboard.php:hen

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

TÄSSÄ,

session->userdata('username');?> näyttää käyttäjänimen, jonka määritimme todennusmenetelmässä

Lisää seuraava koodi osoitteeseen 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>

TÄSSÄ,

Kirjautumislomake lähetetään todennusreitille.

Lisää seuraava koodi tiedostoon 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>

Siinäpä kaikki näkökulmiemme osalta. Testataan nyt sovellustamme.

Tässä opetusohjelmassa käytämme sisäänrakennettua PHP-verkkopalvelinta, mutta voit käyttää mitä tahansa PHP:tä tukevaa web-palvelinta.

Avaa terminaali

Suorita seuraava komento

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

TÄSSÄ,

Yllä oleva komento selaa sovelluskoodihakemistoon ja käynnistää sisäänrakennetun palvelimen portissa 3000.

Huomautus: sovelluksen polun on vastattava polkua, josta latasit tiedoston. CodeIgniter, ja voit käyttää mitä tahansa tietokoneellasi vapaana olevaa porttinumeroa. Portin 3000 käyttö ei ole välttämätöntä.

Avaa seuraavat URL verkkoselaimessasi: http://localhost:3000/dashboard

Sinut ohjataan seuraavalle sivulle

CodeIgniter-istunnon katselukerrat

Napsauta Kirjaudu-painiketta

Näet seuraavat tulokset

CodeIgniter-istunnon katselukerrat

Kun olemme kirjautuneet sisään, voimme nyt nähdä istuntotiedot.

UKK

Käyttäjätiedot säilyvät koko istunnon ajan, kunnes poistat ne käytöstä tai istunto vanhenee. Flashdata on väliaikainen arvo, joka säilyy vain seuraavan pyynnön ajan ja poistetaan sitten automaattisesti, mikä sopii kertaluonteisille viesteille.

Tempdata on istuntodataa, jolla on asetettu vanhenemisaika. Kutsut mark_as_temp()- tai set_tempdata()-funktiota ja annat sille eliniän sekunteina, minkä jälkeen CodeIgniter poistaa arvon automaattisesti, vaikka istunto olisi edelleen aktiivinen.

Oletuksena CodeIgniter tallentaa istunnot palvelimella oleviin tiedostoihin. Voit vaihtaa ajuriksi tietokannan, Redisin tai Memcachedin asetustiedostossa, kun tarvitset jaettua tallennustilaa useille palvelimille.

Kyllä. Tekoäly voi tarkistaa istuntomäärityksesi heikkojen asetusten varalta, suositella istuntotunnuksen uudelleenluomista kirjautumisen jälkeen, evästeiden salauksen käyttöönottoa ja vain HTTPS-evästeiden käyttöä istunnon kaappauksen riskien vähentämiseksi.

Kyllä. Lyhyen kuvauksen perusteella tekoäly voi tuottaa reitit, istunto-ohjaimen ja suojatut näkymät. Lisää aina todellinen tietokannan varmennus ja salasanan hajauttaminen, koska tekoälykehitykset käyttävät usein simuloituja tarkistuksia.

Tiivistä tämä viesti seuraavasti: