Estoy mirando el diseño de mi interfaz y estoy luchando para decidir cuál es la forma más "correcta" de implementar el control de acceso basado en roles, dado a usery a los subjectque userles gustaría acceder.
Por lo que puedo ver, tengo tres opciones principales (una cuarta es una bastardicación de las tres primeras y una quinta es una modificación de la cuarta):
- Consulta
subjectcon una lista de permisos queusertiene:subject.allowAccess(user.getPermissionSet) - Consulte
usercon una lista de permisos quesubjectrequiere:user.hasPermissionTo(subject.getRequiredPermissions()) - Consultar a un tercero para ubicar las intersecciones de permisos:
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - Consulte el
subject/user, mientras delega la "decisión" a una clase de terceros - Intente
useraccedersubjecty arroje un error si no se permite el acceso
Me estoy inclinando hacia la opción cuatro: que subjectcontenga un accessControllercampo, donde las llamadas para subject.userMayAccess(User user)delegar la operación a la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. pero esto plantea más preguntas:
- ¿Debería
accessControllerser un campo frente a una clase estática? - ¿Debería
subjectsaber qué permisos se requieren para poder verlo? - ¿Dónde entra en juego aquí el principio de menor conocimiento, con respecto al llamado
subject.display()? ¿Deben las personas que llamansubject.display()saber que el control de acceso está vigente? (dondesubject.display()es un "método de plantilla" final) - ¿ha
subject.display()administrado el control de acceso, lanzando una excepción donde el usuario no tiene el permiso requerido?
¿Qué se consideraría "mejor práctica" en esta situación? ¿Dónde debería ocurrir la responsabilidad de realizar las verificaciones?
Como esto es algo tanto un ejercicio académico que luego progresará en la implementación, se agradecerán las referencias a los patrones de diseño.