Php 用户身份验证和权限表结构

Php 用户身份验证和权限表结构,php,mysql,authentication,table-structure,Php,Mysql,Authentication,Table Structure,我正在创建一个用户身份验证库(用于此练习) 我要添加的内容之一是,可以将用户分配到多个角色 每个角色都有一组权限(想想editUser、createUser等) 如果用户是两个组的一部分,如果任何组有权执行某个操作,则用户可以执行该操作 我想知道从mysql数据库的角度存储这些信息的最佳方法 我在想 users : ID | username | etc groups : ID | name | e

我正在创建一个用户身份验证库(用于此练习)

我要添加的内容之一是,可以将用户分配到多个角色

每个角色都有一组权限(想想editUser、createUser等)

如果用户是两个组的一部分,如果任何组有权执行某个操作,则用户可以执行该操作

我想知道从mysql数据库的角度存储这些信息的最佳方法

我在想

users            : ID            | username | etc  
groups           : ID            | name     | etc  
user_group       : group_ID      | user_ID  
permissions      : ID            | name     | description (lookup table)
group_permission : permission_ID | group_ID
基本上,如果一个组有一个权限,那么它会在group\u权限中得到一个条目


我的问题是,这是最有效的方法吗,还是我最好将每个权限作为组表中的一列,并删除组权限表?

您的方法看起来很好,而且规范化了,值得称赞。
我缺少一个非权限表,即不允许操作的表。
Active directory具有此功能,允许您快速阻止对对象的权限

这允许您允许访问除……之外的所有帐户。
如果您采用相反的方式,则必须允许访问每个对象,同时忽略HR数据。
第一种方法设置两个对象的权限(一个对父对象的权限,一个对子对象的权限),第二种方法可以运行几十个权限

就我个人而言,我会更新
权限
表,以包括排除项。
这将允许您将排除附加到组和用户

使用黑洞表简化新权限的添加
为了简化添加新权限的过程,您可以创建一个新的黑洞表。
这不会存储任何内容,但会触发一个触发器,为您执行插入操作,通过这种方式,您可以隐藏插入代码规范化了DB的事实

CREATE TABLE bh_permission (
  user_or_group_id unsiged integer not null,
  isuser ENUM('user','group') not null default 'user',
  permission_description varchar(255) not null,
  allow_or_not ENUM('allow','forbid') not null default 'allow'
) ENGINE = BLACKHOLE;
现在,您可以在表中插入指定组或用户id的内容

INSERT INTO bh_permission VALUES ('123','group','p_HR_files_2011','forbid');
并有一个触发器来处理技术细节:

DELIMITER $$

CREATE TRIGGER ai_bh_permission_each AFTER INSERT ON bh_permission FOR EACH ROW
BEGIN
  DECLARE Mypermission_id INTEGER;
  //like is always case-insensitive, `=` is not.
  SELECT p.id INTO Mypermission_id FROM permissions p 
    WHERE name LIKE NEW.permission_description LIMIT 1;
  IF isuser = 'user' THEN
    INSERT IGNORE INTO user_permission (user_id, permission_id, allow_or_not)
      VALUES (NEW.user_or_group_id, Mypermission_id, NEW.allow_or_not);
  ELSE
    INSERT IGNORE INTO group_permission (group_id, permission_id, allow_or_not)
      VALUES (NEW.user_or_group_id, Mypermission_id, NEW.allow_or_not);
  END IF;
END $$

DELIMITER ;

因此,非权限表是用户特有的东西?也就是说,这意味着用户可以是版主,除非该用户滥用了删除帖子的能力(此处使用论坛类比)您可以使用权限id和用户id在非权限表中创建一行,以阻止用户获得该权限?或者这与权限表的工作方式相同,但相反(即,它是特定于组的)。除了说“新用户”组可以做这个动作之外,其他人都可以做吗?(因此该表中唯一的条目是newUser组的一行)@Hailwood,逻辑上排除对用户和组都有用。嗯。。您是否有两个表,一个是
userNonPermission
groupNonPermission
,或者您是否有一个通用的
NonPermission
表,一个是
permission\u ID
group\u ID
user\u ID
,用户ID或组ID列都可以用它来填充?