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 user
y a los subject
que user
les 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
subject
con una lista de permisos queuser
tiene:subject.allowAccess(user.getPermissionSet)
- Consulte
user
con una lista de permisos quesubject
requiere: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
user
accedersubject
y arroje un error si no se permite el acceso
Me estoy inclinando hacia la opción cuatro: que subject
contenga un accessController
campo, 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
accessController
ser un campo frente a una clase estática? - ¿Debería
subject
saber 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.