Sembra che tu stia confondendo tra RBAC e DAC (controllo di accesso discrezionale): Nega accesso non è in genere impiegato in RBAC, ma piuttosto proviene dal mondo DAC. F.e. è comune vedere un ACL NTFS (Access Control List) con DENY al suo interno.
Potresti provare a implementare un modello unito (vedi l'esempio nella mia risposta qui ) - es creazione di un ACL con voci ACE (Access Control Entry) che indicano i ruoli. Per esempio. utilizzando i gruppi per concedere l'accesso alle cartelle ...
Ci sono due possibili soluzioni che puoi usare, forse anche mix'n'match, dipende da cosa ha senso per il tuo sistema (l'ho costruito e usato entrambi, in diversi contesti):
- ACL ordinato - ovvero l'ACL non è una grande pila di voci ACE, ma sono in un ordine specifico: più in alto nella lista ha la precedenza, continua a valutare ACE finché non trovi un PERMIT ACE, o a DENY ACE per quell'utente. Qualunque sia il primo della lista, vince.
- DENY ACE sovrascrive tutti gli altri ACE. Ad esempio, se all'utente viene concesso l'accesso tramite Role1, eseguire la scansione dell'ACL per qualsiasi DENY applicabile all'utente, quindi Role2 bloccherà l'accesso indipendentemente da cosa.
Si noti che non si potrebbe implementare questo con un modello ACL standard, ma in realtà solo controllando i ruoli utente - che va ancora bene, il precedente si applica ancora (solo più difficile da visualizzare e spiegare).
La vera domanda che devi capire è, cosa ha senso per il tuo sistema? Stai cercando di implementare SoD (Segregation / Separation of Duties)? Se è così, è chiaro che DENY deve ignorare qualsiasi PERMESSO. Se si desidera che l'utente configuri questo (nel qual caso il suo DAC, non RBAC), la prima opzione offre la massima flessibilità, poiché esiste un modo per aggirare il problema.