[FEAT] ARIA data-aware: snapshot dati org dell'utente nel prompt (Fase B)
Richiesta: "AI deve sapere i contenuti dei dati a cui ha accesso l'utente". - AIService::orgDataSnapshotBlock($orgId): aggregati LIVE dell'org (compliance score, rischi aperti per livello + top 5, incidenti aperti, asset attivi/rilevanti NIS2, fornitori critici scoperti, NC aperte, formazione, policy per stato). Query con colonne reali (riuso DashboardController), ognuna in try/catch (degrada, non rompe). - Iniettato in askWithRag SOLO se org_data_ok. - SICUREZZA multi-tenant: AiController verifica membership in user_organizations (super_admin bypassa) → org_data_ok; scope rigoroso organization_id → niente leak cross-org da X-Organization-Id falsificato. PRIVACY: niente nome/fatturato (anonimizz.). Smoke: con membership ARIA cita score 80% + 14 rischi (org 996003); senza membership nega l'accesso ai dati. php-fpm reload. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
42529043d3
commit
fe7d0555c6
@@ -54,6 +54,22 @@ class AiController extends BaseController
|
||||
'page_help' => $pageHelp,
|
||||
];
|
||||
|
||||
// Membership verificata → ARIA può iniettare lo snapshot DATI dell'org
|
||||
// (anti-spoof X-Organization-Id; super_admin bypassa, come da modello ruoli).
|
||||
$orgId = (int) ($userContext['organization_id'] ?? 0);
|
||||
$userContext['org_data_ok'] = false;
|
||||
if ($orgId > 0) {
|
||||
if (($user['role'] ?? '') === 'super_admin') {
|
||||
$userContext['org_data_ok'] = true;
|
||||
} else {
|
||||
$member = Database::fetchOne(
|
||||
'SELECT 1 FROM user_organizations WHERE user_id = ? AND organization_id = ?',
|
||||
[$userId, $orgId]
|
||||
);
|
||||
$userContext['org_data_ok'] = (bool) $member;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$aiService = new AIService();
|
||||
$result = $aiService->askWithRag($question, $userContext);
|
||||
|
||||
Reference in New Issue
Block a user