Immagina un modello di dati di un'azienda elettrica e della città che alimenta. L'azienda ha diversi dipartimenti che gestiscono almeno un quartiere ciascuno nella città. Il database aziendale include informazioni per le case in ogni quartiere, i contatori installati a casa, la cronologia di fatturazione, ecc. Qualsiasi dipendente in un dipartimento può accedere e visualizzare tutti i diversi tipi di dati, ma possono solo visualizzare i dati per quartieri che il loro dipartimento gestisce. Schema di esempio:
Dipartimenti
- ID
- Nome
Quartieri
- ID
- Nome
DepartmentsToNeighborHoods (LinkTable)
- DepartmentID
- NeighborhoodID
I dipendenti
- ID
- Nome
- ID reparto (chiave esterna)
Case
- ID
- Indirizzo
- NeighborhoodID (chiave esterna)
Metri
- ID
- HomeID (chiave esterna)
Dato questo modello di dati, sto tentando di implementare un'interfaccia riposante in cui i dipendenti possono estrarre dati ma solo risorse all'interno del proprio dipartimento. Ad esempio, se un dipendente desidera accedere alla cronologia di fatturazione in una determinata casa, può farlo solo se quella casa si trova in un quartiere gestito dal dipartimento del dipendente.
L'unico modo in cui posso pensare a ciò è implementando una funzione di autorizzazioni che controlla se un utente può accedere a una particolare risorsa dato il suo id utente. Una possibile implementazione (pseudocodice):
getMeterDetails(meterID, employeeID) {
permissionQuery = "
select 1
from Meters
join Homes on Homes.ID = Meters.HomeID
join Neighborhoods on NeighborHoods.ID = Homes.NeighborHoodID
join DepartmentsToNeighborhoods as DTN on DTN.NeighborhoodID = Neighborhoods.ID
join Employees on Employees.DepartmentID = DTN.DepartmentID
where Meters.ID = ?
and Employees.ID = ?
"
result = db.runQuery(permissionsQuery, meterID, employeeID)
if (result == 1) {
return MeterModel.get(meterID);
}
else {
return ERROR_VALUE;
}
}
Il problema generale è che voglio limitare l'accesso a particolari risorse basate sull'appartenenza a un'altra risorsa lontana. Il mio metodo attuale richiede che venga eseguita una query di database aggiuntiva ogni volta che viene richiesta una risorsa. Devo anche scrivere query di autorizzazione personalizzate per ciascuna risorsa che espongo perché ognuna utilizza un diverso insieme di relazioni per determinare se l'attuale dipendente può accedere a questa particolare risorsa. C'è un metodo migliore che posso usare per implementare questo tipo di controllo dei permessi?