我正在为我们的公司开发一个应用程序,最终将有很多方法将用户限制在特定的部分/模块中。虽然应用程序仍然很小,但我想转向一种存储权限的新方法,随着应用程序的增长,这些方法仍然易于维护和查询。
目前在我们的MySQL数据库中,我们有一个名为“user”的表,它存储用户的ID,用户名和密码。在名为“user_acl”的单独表中,有以下内容:
user_acl_id
acl_root
acl_news_read
acl_news_write
acl_news_modify
acl_reports_read
acl_reports_write
acl_reports_modify
acl_users_read
acl_users_write
acl_users_modify
我们每分钟只有3个模块,但随着时间的推移会创建更多模块,并且需要添加每个模块的权限。
不是为每个权限创建一个列,还有其他方法或存储此信息吗?
答案 0 :(得分:30)
我会这样做。
table name: permission
columns: id, permission_name
然后我可以使用多对多关系表为用户分配多个权限
table name: user_permission
columns: permission_id, user_id
这个设计允许我添加任意数量的权限,并将其分配给我想要的尽可能多的用户。
虽然上面的设计符合您的要求,但我有自己的方法在我的应用程序中实现ACL。我在这里发帖。
我的ACL实现方法如下:
为此,我提出了以下数据库设计。
role
I store the role name here
+----------+
| Field |
+----------+
| id |
| roleName |
+----------+
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 |
| permissionName |
| permissionKey |
+----------------+
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。我可以让superadmins自己分配权限,等等。正如我所说,这只是为了给你这个想法。
答案 1 :(得分:0)
我相信你应该以jSON格式制作这些权限。
您可以创建另一个具有权限的表,您可以随时添加,修改,删除行。
或
每次用户进行身份验证时,您都可以将这些权限存储在会话中并将其传递给脚本。
我个人的建议是第一个选择。
答案 2 :(得分:0)
像Ibrahim所说,专门为您的权限创建一个新表。为用户分配一个表示其权限级别的数值,例如1 =读取,2 =写入/读取,3 =修改/写入/读取。然后在您的代码中,在允许用户执行特定任务之前检查适当的权限级别。如果他们没有所需的值(3要修改或> = 2要写),那么你就阻止了这种能力。
答案 3 :(得分:0)
我认为你应该有更好的表:
user
user_x_profile
profile
profile_x_function
function
您设置了各种“通用”配置文件“查看器”,“员工”,“经理”等。
为要控制的每个对象设置“功能”条目。
然后将功能链接到profile_x_function中的配置文件。
然后为每个用户分配一个或多个配置文件。
这削减了管理工作。假设您要添加另一个只有“管理员”可以使用的功能 - 您只需在功能表中添加一个新条目,然后在“profile_x_function”表中添加一个条目,该表链接到“manager”配置文件对管理器配置文件的权限并且它可供所有经理使用。
要查询访问权限,您需要五个表连接,但只选择一个permision属性。
答案 4 :(得分:0)
在一本非常著名的MySQL性能书 High Performance MySQL 中,作者特别提到ACL为,其中可以使用SET
之类的数据类型。演示此类用例的示例:
CREATE TABLE acl (
permissions SET('CAN_READ', 'CAN_WRITE', 'CAN_DELETE') NOT NULL
);
INSERT INTO acl VALUES ('CAN_READ,CAN_WRITE');
SELECT permissions FROM acl WHERE find_in_set('CAN_READ', permissions);
问题是,书中也提到,您不能轻易修改权限集(必须使用ALTER TABLE
),也不能将键入SET
的列声明为索引,这可能会导致性能问题。
您还可以使用TINYINT
之类的“包装” ACL列表,其缺点是难以阅读和编码SELECT
句子。