Sto guardando il mio design dell'interfaccia e sto lottando per decidere quale sia il modo più "corretto" per implementare il controllo degli accessi in base al ruolo, dato un user
e un a subject
cui user
vorrebbe accedere.
Per quanto posso vedere, ho tre opzioni fondamentali (una quarta è una bastardizzazione delle prime tre e una quinta è una modifica della quarta):
- Esegui
subject
una query con un elenco di autorizzazioni cheuser
ha -subject.allowAccess(user.getPermissionSet)
- Esegui
user
una query con un elenco di autorizzazionisubject
necessarie per:user.hasPermissionTo(subject.getRequiredPermissions())
- Interroga una terza parte per individuare le intersezioni delle autorizzazioni -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet())
- Eseguire una query su
subject
/user
, mentre si delega la "decisione" a una classe di terze parti - Cerca
user
di accedere asubject
e genera un errore se l'accesso non è consentito
Mi sto avvicinando all'opzione quattro: chiedi al campo di subject
contenere un accessController
campo, dove chiamate a subject.userMayAccess(User user)
delegare l'operazione alla la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. ma poi questo solleva ulteriori domande:
- dovrebbe
accessController
essere un campo vs una classe statica ..? - Dovrebbe
subject
sapere quali autorizzazioni sono necessarie per poterlo visualizzare? - dove entra in gioco il principio della minima conoscenza, rispetto alla chiamata
subject.display()
? I chiamanti dovrebberosubject.display()
mai sapere che il controllo degli accessi è attivo? (dov'èsubject.display()
un "metodo modello" finale) - hanno
subject.display()
gestire il controllo di accesso, un'eccezione in cui l'utente non ha l'autorizzazione richiesta?
Quale sarebbe considerata la "migliore pratica" in questa situazione? Dove dovrebbe effettivamente verificarsi la responsabilità di eseguire i controlli?
Poiché si tratta in qualche modo sia di un esercizio accademico che progredirà nell'implementazione, i riferimenti ai modelli di progettazione sarebbero apprezzati.