Sto guardando il mio design dell'interfaccia e sto cercando di stabilire quale sia il modo più "corretto" per implementare il controllo degli accessi basato sui ruoli, dato un user
e un subject
che la user
vorrebbe accedere.
Per quanto posso vedere, ho tre opzioni principali (una quarta è una bastardizzazione dei primi tre e una quinta è una modifica del quarto):
- Esegui una query su
subject
con un elenco di autorizzazioni cheuser
ha -subject.allowAccess(user.getPermissionSet)
- Esegui una query su
user
con un elenco di autorizzazioni chesubject
richiede -user.hasPermissionTo(subject.getRequiredPermissions())
- Interroga una terza parte per individuare le intersezioni delle autorizzazioni -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet())
-
Esegui una query su
subject
/user
, delegando la "decisione" a una classe di terze parti - Chiedi a
user
di accedere asubject
e genera un errore se l'accesso non è consentito
Mi sto appoggiando all'opzione numero quattro: il subject
contiene un campo accessController
, dove le chiamate a subject.userMayAccess(User user)
delegano l'operazione a la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. ma questo solleva ulteriori domande:
- il
accessController
dovrebbe essere un campo rispetto a una classe statica ..? - Se un
subject
conosce quali autorizzazioni sono richieste per poterlo visualizzare? - dove entra in gioco il principio della minima conoscenza, rispetto a chiamare
subject.display()
? I chiamanti disubject.display()
dovrebbero mai sapere che il controllo degli accessi è in vigore? (dovesubject.display()
è un "metodo modello finale") - ha
subject.display()
gestisce il controllo degli accessi, generando un'eccezione in cui l'utente non dispone dell'autorizzazione richiesta?
Quale sarebbe considerata la "migliore pratica" in questa situazione? Dove dovrebbe effettivamente avere la responsabilità dell'esecuzione dei controlli?
Poiché questo è un po 'sia un esercizio accademico che poi progredirà nell'implementazione, i riferimenti ai modelli di progettazione sarebbero apprezzati.