Бих го направил по този начин.
table name: permission
columns: id, permission_name
и след това мога да задам множество разрешения на потребителя, като използвам таблица за релации много към много
table name: user_permission
columns: permission_id, user_id
Този дизайн ще ми позволи да добавям толкова разрешения, колкото искам, и да го присвоя на толкова потребители, колкото искам.
Докато горният дизайн отговаря на вашите изисквания, аз имам свой собствен метод за внедряване на ACL в моето приложение. Публикувам го тук.
Моят метод за внедряване на ACL е така:
- На потребителя ще бъде назначена роля (администратор, гост, персонал, обществен)
- За една роля ще има присвоени едно или много разрешения (user_write, user_modify, report_read) и т.н.
- Разрешението за потребителя ще бъде наследено от ролята, в която той/тя е
- На потребителя може да бъде присвоено ръчно разрешение, освен разрешението, наследено от ролята.
За да направя това, измислих следния дизайн на база данни.
role
I store the role name here
+----------+
| Field |
+----------+
| id |
| role_name |
+----------+
permission:
I store the permission name and key here
Permission name is for displaying to user.
Permission key is for determining the permission.
+----------------+
| Field |
+----------------+
| id |
| permission_name |
| permission_key |
+----------------+
role_permission
I assign permission to role here
+---------------+
| Field |
+---------------+
| id |
| role_id |
| permission_id |
+---------------+
user_role
I assign role to the user here
+---------------+
| Field |
+---------------+
| id |
| user_id |
| role_id |
+---------------+
user_permission
I store the manual permission I may allow for the user here
+---------------+
| Field |
+---------------+
| id |
| user_id |
| permission_id |
+---------------+
Това ми дава повече контрол върху ACL. Мога да разреша на суперадминистраторите сами да задават разрешение и т.н. Както казах, това е само за да ви дам идеята.