Skip to content

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

MetodoRitornoDescrizione
getUserId()?intID utente autenticato
getUsername()?stringUsername
getUserEmail()?stringEmail utente
getUserGroup()?intID 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)

MetodoRitornoDescrizione
getCompanyId()?intID azienda attiva
getCompanyName()?stringNome azienda attiva
getAccessibleCompanies()arrayTutte le aziende accessibili
canAccessCompany($id)boolVerifica 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

MetodoRitornoDescrizione
isAuthenticated()boolUtente autenticato?
isAdmin()boolAdmin dell'azienda corrente?
hasProgram($code)boolHa 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

MetodoRitornoDescrizione
toArray()arrayDump completo del contesto
requireAuth()voidLancia eccezione se non autenticato
requireCompany()voidLancia 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

  1. Al login, vengono caricate tutte le aziende accessibili
  2. Una viene impostata come "attiva" (getCompanyId())
  3. Tutte le operazioni sono filtrate per l'azienda attiva
  4. 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;
}

Documentazione interna Elerama