Perso je suis plus pour un système avec une table classique users et une table roles['id', 'user_id', 'action']
exemple
[1, 1, 'post.edit,']
[2, 1, 'post.create']
je vérifie avant d'afficher l'écran en question si l'user a les droits. Dans mon cas l'utilisateur 1 peut créer, modifier mais pas supprimer les posts. Et si tu utilises une relation polymorphique tu peux utiliser cette table pour un user, un groupe, un sous-groupe. Mais si tu ne veux gérer que les groupes alors tu crées une table pivot [user, group] et dans mon exemple il ne s'agit plus d'users mais de groupes :)
C'est simple et ca me semble suffisant dans beaucoup de cas
Je ne suis pas fan de ton système de calcul de permissions. On faisait ça à l'époque où nous devions limiter l'usage des disques, mais pour avoir la permission on doit faire des calculs et c chiant :) maintenant on peut se lâcher sur l'espace de stockage autant en profiter :)