在数据库中存储应用程序权限

时间:2012-04-25 07:43:26

标签: php mysql arrays permissions store

我正在为我们的公司开发一个应用程序,最终将有很多方法将用户限制在特定的部分/模块中。虽然应用程序仍然很小,但我想转向一种存储权限的新方法,随着应用程序的增长,这些方法仍然易于维护和查询。

目前在我们的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个模块,但随着时间的推移会创建更多模块,并且需要添加每个模块的权限。

不是为每个权限创建一个列,还有其他方法或存储此信息吗?

5 个答案:

答案 0 :(得分:30)

我会这样做。

table name: permission
columns: id, permission_name

然后我可以使用多对多关系表为用户分配多个权限

table name: user_permission
columns: permission_id, user_id

这个设计允许我添加任意数量的权限,并将其分配给我想要的尽可能多的用户。

虽然上面的设计符合您的要求,但我有自己的方法在我的应用程序中实现ACL。我在这里发帖。

我的ACL实现方法如下:

  1. 将为用户分配一个角色(管理员,访客,员工,公众)
  2. 角色将分配一个或多个权限(user_write,user_modify,report_read)等。
  3. 用户的权限将从他/她所属的角色继承
  4. 除了从角色继承的权限外,还可以为用户分配手动权限。
  5. 为此,我提出了以下数据库设计。

    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句子。