首先,我们的需求是判断某一个用户对当前操作的控制器或控制器的方法是否有权限访问,
如果多个用户同时拥有同样的权限,那我们就需要给这些用户指定同一个用户角色,然后只需要通过角色来对操作的访问进行权限控制,
那我们表结构需要这样来设计,这个很重要,如下:
第一张数据表(用户表):
字段名称 | 字段说明 |
id | 用户ID(主键自增) |
username | 用户名 |
password | 用户密码 |
第二张数据表(角色表):
字段名称 | 字段说明 |
id | 用户角色ID(主键自增) |
name | 用户角色名称 |
第三张数据表(节点表):
字段名称 | 字段说明 |
id | 操作节点ID(主键自增) |
name | 操作节点的名称 |
zh_name | 节点的中文说明 |
我们使用第三范式来设计关联表,这样做的好处是,避免数据冗余,并且对于一对多,多对一的关系都可以清晰的记录,条理清晰
第四张数据表(节点对应角色表):
字段名称 | 字段说明 |
role_id | 用户角色ID(外键,关联角色表中的主键ID) |
note_id | 操作节点ID(外键,关联节点表中的主键ID) |
第五张数据表(用户对应角色表):
字段名称 | 字段说明 |
role_id | 用户角色ID(外键,关联角色表中的主键ID) |
user_id | 用户ID(外键,关联用户表中的主键ID) |
通过这五张表就可以对权限进行访问控制,它的具体操作步骤如下:
用户输入用户名密码登录,
通过用户表判断,如果输入的用户名密码不合法,跳回重新登录
如果合法,在用户表中返回用户的ID号,
通过此用户ID号,到用户与角色的关联表中查询出用户的角色ID号,
拿到角色ID号,通过此ID号到角色与节点的关联表中查询出此角色拥有的节点访问权限,
将此权限节点全部存入SESSION中,当用户访问某一个模块的时候,
例如:http://www.lampbroher.net/index.php/stu/index
我们用session中的权限与$_GET['m']与$_GET['a']去对比,
如果$_GET['m']或者$_GET['a']在SESSION中不存在,说明该用户没有此权限,作出处理即可。