Parece que estás confundiendo entre RBAC y DAC (control de acceso discrecional): Deny Access no se emplea normalmente en RBAC, sino que proviene del mundo DAC. F.e. es común ver una ACL de NTFS (Lista de control de acceso) con DENY en ella.
Puede estar intentando implementar un modelo combinado (vea el ejemplo en mi respuesta aquí ) - por ejemplo, construyendo una ACL con entradas de control de acceso (Access Control Entry) que apunta a roles. P.ej. utilizando grupos para otorgar acceso a las carpetas ...
Hay dos soluciones posibles que puedes usar, tal vez incluso mix'n'match, dependiendo de lo que tenga sentido para tu sistema (he construido y usado ambos, en diferentes contextos):
- ACL ordenada - es decir, la ACL no es una gran pila de ACE, pero están en un orden específico: más arriba en la lista tiene prioridad, siga evaluando ACE hasta que encuentre un ACE DE PERMISO, o un DENY ACE para ese usuario. Cualquiera que sea el primero en la lista, gana.
- DENY ACE anula todas las demás ACE. Es decir, si al usuario se le otorga acceso a través de Role1, analice la ACL en busca de cualquier DENY que se aplique al usuario, y luego Role2 bloquearía el acceso sin importar qué.
Tenga en cuenta que es posible que no esté implementando esto con un modelo de ACL estándar, pero que realmente solo verifique los roles de los usuarios; aún así está bien, lo anterior aún se aplica (es más difícil de visualizar y explicar).
La pregunta real que necesita resolver es: ¿Qué tiene sentido para su sistema? ¿Está intentando implementar SoD (Segregación / Separación de tareas)? Si es así, está claro que DENY debe anular cualquier PERMISO. Si desea que el usuario configure esto (en cuyo caso es su DAC, no RBAC), la primera opción ofrece la mayor flexibilidad, ya que existe una manera de evitarlo.