PHP权限分配思路
网站内有好多栏目,每个栏目有不懂的栏目ID
新建一个表,表里面记录用户ID与所拥有管理权限的栏目ID
用户登录时,将用户的权限字段读取并session,将session的权限信息数组化,然后进行验证用户是否有权限管理栏目。 展开
可以,但是这样不便于管理,因为你的是用户直接与权限打交道,关于权限的思路以下有4种常见的分类,你所说的属于第4类,不推荐使用,推荐使用前3类(用的最多的是第3类):
1.用户+组+角色+权限
2.用户+组+权限
3.用户+角色+权限
4.用户+权限
我来举个例子,就拿第3类来举例:
权限:用户操作的具体事件如:添加管理员,修改管理员,删除管理员
角色:角色指定某一类用户拥有固定的权限,例如:超级管理员,管理员
用户:最终执行权限的用户,如:admin,admin2
那么我们根据:用户+角色+权限,需要3个表互相关联(每个表的id是唯一标识符,也就是主键)用户表level字段用来存储level表id,level表permission字段用来存储permission表id
用户表:php_user | 数据:id = 1, username = admin, level = 1 | id = 2, username = admin2, level = 2
等级表:php_level | 数据:id = 1, level_name = 超级管理员, permission = 1,2,3 | id = 2, level_name = 管理员, permission = 2
权限表:php_permission 数据:id = 1, permission_name = 添加管理员 | id = 2, permission_name = 修改管理员 | id = 3, permission_name = 删除管理员
如果还没看懂,请再看下面的PHP实际例子:
// ... 之前的操作,如先连接数据库,登录用户
$_COOKIE['username'] = 'admin2'; // 用户名称
// SQL查询语句,查询用户等级,用来判断是否可以:添加管理员
$sql = "SELECT `level` FROM `php_user` WHERE `username` = '{$_COOKIE['username']}' LIMIT 1;";
// 获取查询结果
$result = msyql_query($sql);
// 解析结果集
$array = mysql_fetch_assoc($result);
// 在创建SQL语句用来查询等级表获取操作权限
$sql = "SELECT `permission` FROM `level` WHERE `id` = '{$array['level']}' LIMIT 1;";
// 获取查询结果
$result = msyql_query($sql);
// 解析结果集
$array = mysql_fetch_assoc($result);
// 创建权限数组,用SESSION存储,记得开启SESSION,session_start();
// 使用,逗号分割权限字符,例如:1,2,3 = array(1, 2, 3)
$_SESSION['permission'] = explode(',', $array['permission']);
// 最后来判断是否有操作权限
if (!in_array(1, $_SESSION['permission'])) exit('无权操作!');
// 授权成功,开始:添加管理员,但是我们的用户是admin2,他是管理员,他的权限只有:修改管理员,因此admin2无权操作:添加管理员
以上如果还是没有明白或有任何的问题,可以随时追问~
非常感谢您的精彩回答,再问您个问题,username是用$_COOKIE效率高,还是SESSION呢?
一般的应用cookie与session的效率是体现不出来的。首先cookie与session都会创建会话文件,如果用户数量大或巨大的话,cookie的会话文件是保存在客户机中,对于服务端硬盘减轻了很大的压力,但是缺点是容易被篡改;session的会话文件保存在服务端,会加大服务端硬盘读取的压力,因此不易于大规模的运用。但是在Web开发当中有一个约定,前台用户登陆一律cookie(减轻服务端压力),后台管理员登录一律用session(管理员数量少,且要求安全性高,因此选择session,不易被篡改)
用户表和权限表关联一个字段,比如 note字段
note字段存储权限id
用户登录时,检测到权限id,然后根据权限id查询权限表,来判断用户的权限
然后根据权限进行分配,哪些操作显示与不显示,或者哪些操作能用不能用