PHP权限管理,狂散分 我想做个论坛但是还有好多问题不懂,不敢轻易动手做比如好多论坛都有版主每个版主都只能修改自己管理的版块的内容,而不能修改其他版块这个权限系统是怎么做出来的啊?原理是怎么样的?哪位达人给讲讲啊?散分~~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 搜索 Rbachttp://www.google.com/search?q=php+rbac&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:zh-CN:official&client=firefox-a 先判断该用户的权限,是普通用户,还是管理员,还是版主。如果是版主再判断其所管理的版块,再根据文章所在的版块去判断。听起不不复杂,要想做得较好还是参考一下成熟的论坛是怎么做的吧。比如:www.phpbb.com (感觉很复杂,不建议参考)www.discuz.netwww.phpwind.com等等。 原理 就是每个 人 对应自己的权限user 表userid user admin 1 cww Y2 add Npermissions 表id userid per1 1 1,2,3,4,5 ...,10 // 分别对应 栏目 id 为 1 到 10 的栏目2 2 2,3 // 只对 2,3 有权限 再建个栏目表, 我只说个简单的,供 LZ 参考 phpBoy005的方案貌似可行。还有更好的解决方案吗?详细点最好啊本人没做过网站,这是第一个~~所以很菜的说~~ 随便一个不太大的程序如果注释的不好都够我研究两天的了来这问就是为了迅速点么~~我大概了解了下一般都是分组,然后创建权限表,用户登录时取出权限值写入session。然后在需要判断用户权限的页面中判断session的值。这样对不啦? 通用点的就是phpgacl了,你可以研究研究http://phpgacl.sourceforge.net/ 之所以重复开发,一是为了能够对程序有更深入的了解,二是自己开发的东西自己用着熟练,三是自己开发的能够准确满足自己的要求,其他的一些存在的系统是面向绝大多数用户的,用的人多了,研究的多了,就会有漏洞,虽然所有的程序都存在漏洞,但是没被人发现就不叫漏洞。最重要的就是为了锻炼自己的能力,系统都是人开发出来的,如果光用别人的,自己不动手,什么时候才能参与到系统开发中呢?谢谢楼上各位的指点,我研究了研究,大概写了一个用户登录类,能够判断用户权限并且保存进session。发来给大家看下,看看有什么可以改进的地方吗?<?phpinclude 'mcrypt.inc.php'; //MCRYPT加密类文件,由数据库连接类继承而来session_start(); class Log extends Mcrypt { public $name; //保存用户名 public $link; //保存数据库连接句柄 private $row; //查询结果 function __construct() { $this->link=conn::connect(); //连接数据库 } function userLog($name='',$pass='') //主要函数,用来实现用户登录 { $conn=$this->link; //将数据库连接句柄赋给局部变量,提高效率 $sql="SELECT * FROM t_userdata WHERE u_name='$name'"; //开始查询数据库 $r=$conn->query($sql); $r->setFetchMode(PDO::FETCH_ASSOC); $row=$r->fetch(); if(empty($row)) //如果没有结果说明用户名输入错误 { $message='用户名错误'; } else if($row['u_pass']!=$pass) //如果密码错误 { $message='密码错误'; } else { $this->name=$name; //将用户名返回 $this->row=$row; //将数据库结果集返回 $this->checkPower(); //检查权限 $this->setCookie(); //设置cookie $message='欢迎您:'.$row['u_name']; } echo $message; } function checkPower() //检查权限函数 { $conn=$this->link; //将数据库句柄赋值给局部变量 $sql1="SELECT t_group.g_categoryid as category,t_power.* FROM t_group inner join t_power on t_group.g_groupid=t_power.p_groupid WHERE t_group.g_username='$this->name'"; //联合查询数据库,取出权限权值和所属板块ID $r=$conn->query($sql1); $row=$r->fetch(); $p=0; foreach ($row as $key=>$value) //将权值进行或运算后存入 session 以便以后进行与运算判断 { switch ($key) { case 'category' : $_SESSION['power']['category']=$row['category'];break;//用户所属版块 case 'p_groupid' : break; //p_groupid 用户所属组ID,用来联合查询,不用处理 default: $p=$p|$value; //将权值或运算 } } $_SESSION['power']['power']=$p; //将权值存入session } function setCookie() //设置cookie { $rows=$this->row; //将数据库查询结果集赋值给局部变量 setcookie('yh_user',$this->en_code($rows['u_name'],3600)); setcookie('yh_username',$this->en_code($rows['u_level']),3600); setcookie('yh_useroicq',$this->en_code($rows['u_oicq']),3600); setcookie('yh_userdate',$this->en_code($rows['u_date']),3600); setcookie('yh_userdate',$this->en_code($rows['u_id']),3600); }}?>这种方法只能保存八种权限,因为二进制只能保存到256 补充一下,还是别用Mcrypt了,还有点问题,这东西正在开发中老实点base64_encode吧~~ 终于搞懂了权限系统怎么运作的了唉,人笨了干什么都慢先简单设计一个小系统用着吧以后再扩展 一,人 表 id 姓名 组id 1 张三 1 2 李四 2 二, 组 表 id 组名 1 党支部 2 团支部 3 小脚侦察队 4 特权组 三,权限表 id 权限名 1 扫地 2 看报纸 3 看毛片 4 罚款 四,组权对应表 id 组id 权id 1 1 1 2 1 2 3 2 2 4 2 3 5 3 3 6 3 4 7 4 1 8 4 2 9 4 3 10 4 4 我参考的这个家伙的设计,感觉还不错,就是缺少角色控制,不过暂时还用不到,在权限表后面加了个权重值列,以便运用时能用简单的与运算判断权限。咳,可算完成了~~结贴~~~来者有分~ 读取图片SRC的问题 一个php include的问题。求解! 谁搞过新网的api域名注册接口?? MySQL Enterprise Server不再开源,会多大程度上影响了php的发展。??? php连不上mysql PHP调用SHELL执行MYSQL脚本文件 大家帮助我看下,这个问题这么解决!谢谢!!! json_encode 中文的数据冗余似乎很严重 PHP有没有is_type()函数? 请教LINUX下文件夹权限问题 FF下对xml节点的操作 mysql中关于utf-8与GB2312的问题!
www.discuz.net
www.phpwind.com等等。
1 cww Y
2 add Npermissions 表id userid per
1 1 1,2,3,4,5 ...,10 // 分别对应 栏目 id 为 1 到 10 的栏目
2 2 2,3 // 只对 2,3 有权限 再建个栏目表, 我只说个简单的,供 LZ 参考
还有更好的解决方案吗?
详细点最好啊
本人没做过网站,这是第一个~~所以很菜的说~~
来这问就是为了迅速点么~~
我大概了解了下
一般都是分组,然后创建权限表,用户登录时取出权限值写入session。
然后在需要判断用户权限的页面中判断session的值。这样对不啦?
http://phpgacl.sourceforge.net/
最重要的就是为了锻炼自己的能力,系统都是人开发出来的,如果光用别人的,自己不动手,什么时候才能参与到系统开发中呢?
谢谢楼上各位的指点,我研究了研究,大概写了一个用户登录类,能够判断用户权限并且保存进session。
发来给大家看下,看看有什么可以改进的地方吗?
<?php
include 'mcrypt.inc.php'; //MCRYPT加密类文件,由数据库连接类继承而来
session_start();
class Log extends Mcrypt
{
public $name; //保存用户名
public $link; //保存数据库连接句柄
private $row; //查询结果
function __construct()
{
$this->link=conn::connect(); //连接数据库
}
function userLog($name='',$pass='') //主要函数,用来实现用户登录
{
$conn=$this->link; //将数据库连接句柄赋给局部变量,提高效率
$sql="SELECT * FROM t_userdata WHERE u_name='$name'"; //开始查询数据库
$r=$conn->query($sql);
$r->setFetchMode(PDO::FETCH_ASSOC);
$row=$r->fetch();
if(empty($row)) //如果没有结果说明用户名输入错误
{
$message='用户名错误';
}
else if($row['u_pass']!=$pass) //如果密码错误
{
$message='密码错误';
}
else
{
$this->name=$name; //将用户名返回
$this->row=$row; //将数据库结果集返回
$this->checkPower(); //检查权限
$this->setCookie(); //设置cookie
$message='欢迎您:'.$row['u_name'];
}
echo $message;
}
function checkPower() //检查权限函数
{
$conn=$this->link; //将数据库句柄赋值给局部变量
$sql1="SELECT t_group.g_categoryid as category,t_power.*
FROM t_group
inner join t_power on t_group.g_groupid=t_power.p_groupid
WHERE t_group.g_username='$this->name'"; //联合查询数据库,取出权限权值和所属板块ID
$r=$conn->query($sql1);
$row=$r->fetch();
$p=0;
foreach ($row as $key=>$value) //将权值进行或运算后存入 session 以便以后进行与运算判断
{
switch ($key)
{
case 'category' : $_SESSION['power']['category']=$row['category'];break;//用户所属版块
case 'p_groupid' : break; //p_groupid 用户所属组ID,用来联合查询,不用处理
default: $p=$p|$value; //将权值或运算
}
}
$_SESSION['power']['power']=$p; //将权值存入session
}
function setCookie() //设置cookie
{
$rows=$this->row; //将数据库查询结果集赋值给局部变量
setcookie('yh_user',$this->en_code($rows['u_name'],3600));
setcookie('yh_username',$this->en_code($rows['u_level']),3600);
setcookie('yh_useroicq',$this->en_code($rows['u_oicq']),3600);
setcookie('yh_userdate',$this->en_code($rows['u_date']),3600);
setcookie('yh_userdate',$this->en_code($rows['u_id']),3600);
}
}
?>
这种方法只能保存八种权限,因为二进制只能保存到256
老实点base64_encode吧~~
唉,人笨了干什么都慢
先简单设计一个小系统用着吧
以后再扩展
一,人 表
id 姓名 组id
1 张三 1
2 李四 2
二, 组 表
id 组名
1 党支部
2 团支部
3 小脚侦察队
4 特权组
三,权限表
id 权限名
1 扫地
2 看报纸
3 看毛片
4 罚款
四,组权对应表
id 组id 权id
1 1 1
2 1 2
3 2 2
4 2 3
5 3 3
6 3 4
7 4 1
8 4 2
9 4 3
10 4 4 我参考的这个家伙的设计,感觉还不错,就是缺少角色控制,不过暂时还用不到,在权限表后面加了个权重值列,以便运用时能用简单的与运算判断权限。
咳,可算完成了~~结贴~~~来者有分~