La soluzione più efficente è quella delle ACL associate all'utente/gruppo!

Ovvero hai gli utenti ed hai i gruppi e poi hai una tabella aggiuntiva dove tieni TUTTE le ACL del sistema indicando a che fanno riferimento tramite dei campi: personalmente tengo 3 campi, con su una chiave primaria, ovvero "Type", che fa riferimento alla tipologia ed è un enum, "Id", che fa riferimento all'id, come INT 10 UNSIGNED, ed infine a "Permission", che fa riferimento al permesso, ed è un varchar. A questi campi va aggiunto in realtà un quarto campo, sempre di tipo enum, che indica il tipo di contenuto (principalmente Number, String, Serialized) in modo da permette di gestire automaticamente vari tipi di campi e di controlli sul contenuto.

In questo modo quando un utente deve accedere ad una pagina provo a cercare la acl chiamata X per l'utente Y che fa parte del tipo Z e vedo istantaneamente chi è e chi non è.

Se vuoi automatizzare i controlli, nell'array metti il nome del permesso in modo che il sistema effettui autonomamente i controllo necessari con la possibilità, però di fare maggiore distinzione dentro il codice per operazioni particolari e/o speciali!