Session Context
Session_context e un servizio unificato per accedere ai dati della sessione utente.
Perche Session_context?
Prima di questo servizio, i dati sessione erano sparsi tra Auth e CI_Session:
php
// PRIMA - Pattern frammentato
$userId = $this->auth->get_user_id();
$companyId = $this->auth->get_active_company_id();
$companies = $this->session->userdata('COMPANY');
$isAdmin = $this->auth->get_user_type_company() === 1;Con Session_context hai un'interfaccia consistente:
php
// DOPO - API unificata
$userId = $this->ctx->getUserId();
$companyId = $this->ctx->getCompanyId();
$companies = $this->ctx->getAccessibleCompanies();
$isAdmin = $this->ctx->isAdmin();Utilizzo
Caricare Session_context
php
class MyController extends Erp_controller
{
protected $ctx;
public function __construct()
{
parent::__construct();
$this->CI->load->library('Session_context');
$this->ctx = $this->CI->session_context;
}
}Metodi Disponibili
User Identity
| Metodo | Ritorno | Descrizione |
|---|---|---|
getUserId() | ?int | ID utente autenticato |
getUsername() | ?string | Username |
getUserEmail() | ?string | Email utente |
getUserGroup() | ?int | ID gruppo/ruolo |
php
$userId = $this->ctx->getUserId(); // 123
$username = $this->ctx->getUsername(); // "mario.rossi"
$email = $this->ctx->getUserEmail(); // "mario@example.com"Company Context (Multi-tenancy)
| Metodo | Ritorno | Descrizione |
|---|---|---|
getCompanyId() | ?int | ID azienda attiva |
getCompanyName() | ?string | Nome azienda attiva |
getAccessibleCompanies() | array | Tutte le aziende accessibili |
canAccessCompany($id) | bool | Verifica accesso a un'azienda |
php
// Azienda attiva
$companyId = $this->ctx->getCompanyId(); // 456
$companyName = $this->ctx->getCompanyName(); // "ACME Srl"
// Tutte le aziende
$companies = $this->ctx->getAccessibleCompanies();
// [456 => ['COMPANY_NAME' => 'ACME Srl', ...], 789 => [...]]
// Verifica accesso
if ($this->ctx->canAccessCompany(789)) {
// L'utente puo accedere all'azienda 789
}Authorization
| Metodo | Ritorno | Descrizione |
|---|---|---|
isAuthenticated() | bool | Utente autenticato? |
isAdmin() | bool | Admin dell'azienda corrente? |
hasProgram($code) | bool | Ha accesso a un programma/modulo? |
php
// Verifica autenticazione
if (!$this->ctx->isAuthenticated()) {
return $this->unauthorized();
}
// Verifica admin
if ($this->ctx->isAdmin()) {
// Operazioni riservate agli admin
}
// Verifica permessi programma
if ($this->ctx->hasProgram('WAREHOUSE_WRITE')) {
// Puo scrivere in magazzino
}Utility
| Metodo | Ritorno | Descrizione |
|---|---|---|
toArray() | array | Dump completo del contesto |
requireAuth() | void | Lancia eccezione se non autenticato |
requireCompany() | void | Lancia eccezione se no company |
php
// Debug/logging
log_message('debug', 'Context: ' . json_encode($this->ctx->toArray()));
// {"user_id":123,"username":"mario","company_id":456,"is_admin":true,...}
// Validazione con eccezione
try {
$this->ctx->requireAuth();
$this->ctx->requireCompany();
} catch (Exception $e) {
return $this->unauthorized();
}Multi-tenancy
Elerama e multi-tenant: un utente puo accedere a piu aziende.
Come funziona
- Al login, vengono caricate tutte le aziende accessibili
- Una viene impostata come "attiva" (
getCompanyId()) - Tutte le operazioni sono filtrate per l'azienda attiva
- L'utente puo cambiare azienda tramite
switch_company
Esempio pratico
php
// Nel model - SEMPRE filtrare per azienda
public function getAll(int $companyId)
{
return $this->db
->where('ID_COMPANY', $companyId)
->get('COM_BRANDS')
->result_array();
}
// Nel controller - usare il contesto
$brands = $this->lib->list($this->ctx->getCompanyId());Sicurezza
Non passare MAI l'ID azienda dal client. Usa sempre $this->ctx->getCompanyId() per prevenire accessi non autorizzati tra aziende.
Cambio Azienda
http
POST /erp_auth/switch_company
Content-Type: application/json
{
"id_company": 789
}Dopo il cambio, getCompanyId() ritornera il nuovo ID.
Best Practices
1. Iniettare nel costruttore
php
public function __construct()
{
parent::__construct();
$this->CI->load->library('Session_context');
$this->ctx = $this->CI->session_context;
}2. Passare valori alle library
php
// Nel controller
$response = $this->lib->create(
$this->ctx->getCompanyId(),
$this->ctx->getUserId(),
$params['code']
);3. Non accedere a session/auth direttamente
php
// NO - Accesso diretto
$companyId = $this->auth->get_active_company_id();
// SI - Tramite Session_context
$companyId = $this->ctx->getCompanyId();4. Usare per audit trail
php
// Nel model - tracciare chi ha modificato
$data = [
'CODE' => $code,
'LAST_MOD_USER' => $userId, // Da ctx->getUserId()
'LAST_MOD_DATE' => date('Y-m-d H:i:s')
];Riferimento Classe
php
// src/libraries/Session_context.php
class Session_context
{
// User Identity
public function getUserId(): ?int;
public function getUsername(): ?string;
public function getUserEmail(): ?string;
public function getUserGroup(): ?int;
// Company Context
public function getCompanyId(): ?int;
public function getCompanyName(): ?string;
public function getAccessibleCompanies(): array;
public function canAccessCompany(int $companyId): bool;
// Authorization
public function isAuthenticated(): bool;
public function isAdmin(): bool;
public function hasProgram(string $programCode): bool;
// Utility
public function toArray(): array;
public function requireAuth(): void;
public function requireCompany(): void;
}