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 usere un a subjectcui uservorrebbe accedere.
Per quanto posso vedere, ho tre opzioni fondamentali (una quarta è una bastardizzazione delle prime tre e una quinta è una modifica della quarta):
- Esegui
subjectuna query con un elenco di autorizzazioni cheuserha -subject.allowAccess(user.getPermissionSet) - Esegui
useruna query con un elenco di autorizzazionisubjectnecessarie 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
userdi accedere asubjecte genera un errore se l'accesso non è consentito
Mi sto avvicinando all'opzione quattro: chiedi al campo di subjectcontenere un accessControllercampo, 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
accessControlleressere un campo vs una classe statica ..? - Dovrebbe
subjectsapere 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.