关于PHP权限问题

hmzhmz 2012-11-15 10:43:02
目的描述:
系统中包含各个模块,模块下面又分为许多子模块,理论上是无限分级的模块。要实现对各个模块的各种权限操作。
现在有的权限包裹增、删、改、查,下载,发帖,上传权限,权限对应权限表,允许添加新权限。权限表数据结构(权限ID,权限名称,备注)。
每个模块包含权限表中的一种或多种权限,父级模块的权限子集模块不具有继承性,也就是说,对一个子集模块的父级模块具有修改权限,但是子集模块不会继承该权限。
用户的权限继承于用户组,通过调整用户组的权限来控制用户的权限。一个用户只能属于一个用户组,一个用户组可以拥有多个用户。

求解 怎么实现这样情况下的权限分配问题
...全文
1080 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
我最猪头 2012-11-22
  • 打赏
  • 举报
回复
RBAC~~~~~~~~~~
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
我把分打下面了额
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
引用 21 楼 xuzuning 的回复:
你不是说用户权限就是所在组的权限吗?用户的权限继承于用户组,通过调整用户组的权限来控制用户的权限。 既然你已经将所有组权限都保存到了缓存文件中了,那么还要查数据库干什么呢? 用户登录时,将所隶属的组保存于 session 进入模块时,加载相应组的权限缓存文件。你是以代码形式保存的,只需 include 即可 检查对该模块的权限,作出相应动作。就可以了呀
我晕呀........我搞错了.......纠结...........我可以直接对用户组权限判断呀 我一直想的是和模块比较,纠结.....解决了 谢谢............
xuzuning 2012-11-16
  • 打赏
  • 举报
回复
你不是说用户权限就是所在组的权限吗?用户的权限继承于用户组,通过调整用户组的权限来控制用户的权限。 既然你已经将所有组权限都保存到了缓存文件中了,那么还要查数据库干什么呢? 用户登录时,将所隶属的组保存于 session 进入模块时,加载相应组的权限缓存文件。你是以代码形式保存的,只需 include 即可 检查对该模块的权限,作出相应动作。就可以了呀
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
一个模块可以拥有增删改查,下载,上传等等权限,但是它自己不知道,所以要查数据库,就是这个过程太多了,数据库压力大
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
引用 18 楼 xuzuning 的回复:
你这只是建立组权限缓存文件的代码。瓶颈肯定不在这里了,因为只要权限设置没有变化时,缓存文件不会每次访问都生成
嗯,问题是一个用户进入这个系统了 他点击了一个模块,那么这个时候模块就要先判断 这个模块自己拥有哪些权限设置,然后再去判断用户所在组的权限,这样每个用户每次访问一个模块,模块自己就要查询一次数据库判断自己拥有哪些权限 然后在和该用户权限缓存文件中该模块的权限加权做位运算与。
xuzuning 2012-11-16
  • 打赏
  • 举报
回复
你这只是建立组权限缓存文件的代码。瓶颈肯定不在这里了,因为只要权限设置没有变化时,缓存文件不会每次访问都生成
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
框架用的是CI
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
缓存类库文件
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* 获取当前用户所在组的权限并生成一个权限文件缓存在文件系统中
*/
class Right{

//用户所在组的ID
private $group_id = "";

//权限表的名称
private $right_table = "";

//当前用户所在用户组的名称
private $group_name = "admin";

//存放查询的用户组权限数据位置
private $cache_dir = "application/rightcache";

public function __construct($group_id = 1,$right_table = 'right')
{
$this->CI =& get_instance();
$this->group_id = $group_id;
$this->right_table = $right_table;
if( ! $this->judge_group_cache_file_exists())
{
$db = $this->CI->load->database();
$this->get_group_for_all_right();
}
}

/**
* 判断当前用户所在的用户组的缓存数据文件是不是存在
*
* @return string
*/
public function judge_group_cache_file_exists()
{
$file = $this->cache_dir.'/'.md5($this->group_name).'.php';
$result = @file_get_contents($file);
return $result;
}

/**
* 取出该用户组对系统所有模块的权限
*
*/
public function get_group_for_all_right()
{
$r = $this->CI->db->get_where($this->right_table,array('group_id' => $this->group_id));
$data = $r->result_array();
$r->free_result();
$right = array();
foreach($r->result_array() as $row)
{
@$right[$row['mod_id']] += pow(2,$row['right_id']);
}

$this->set_file_cache($right);
}

/**
* 调整从数据库中查出的权限数组为需要的格式
* 格式:
* array = (
* [mod_id_1] = 2^权限ID_1 + .... 2^权限ID_N,
* [mod_id_2] = 2^权限ID_1 + .... 2^权限ID_N,
* ......
* [mod_id_N] = 2^权限ID_1 + .... 2^权限ID_N
* )
* 然后写入指定的权限缓存文件中
* @param array $right
* @return number $int
*/
public function set_file_cache($right)
{
$right='<?php
$array='.var_export($right,TRUE).';';
$file = $this->cache_dir.'/'.md5($this->group_name).'.php';
$int = file_put_contents($file, $right);
return $int;
}

/**
* 权限在数据库中的相关信息变更时触发更新权限缓存文件
*
*/
public function update_right_file_cache()
{
$this->get_group_for_all_right();
}
}

// END Right Class

/* End of file Right.php */
/* Location: ./application/libraries/Right.php */
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
to #13 他说的与你说的一样 不过有文件缓存肯定是不妥当的。比如同时有一千的用户登录,你就得有一千个缓存文件? 你没有贴出代码,不知道“性能上还是不理想”的瓶颈在哪里
用户是属于用户组的 用户组是权限的载体,有几个用户组就有几个用户组缓存权限文件
xuzuning 2012-11-16
  • 打赏
  • 举报
回复
to #13 他说的与你说的一样 不过有文件缓存肯定是不妥当的。比如同时有一千的用户登录,你就得有一千个缓存文件? 你没有贴出代码,不知道“性能上还是不理想”的瓶颈在哪里
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
引用 10 楼 acabin 的回复:
槽点太多………… 首先,你难道没有内存缓存? 文件缓存的性能当然低下了啊 第二,修改成数组的时候,你后面做的根本不是位运算 位运算是这个形式的: $calcRight = 0; foreach($rights as $right) $calcRight |= 1 << $right; 然后比较的时候 if($calcRight & $your_right) {……
我用的是文件缓存,你说的我确实没有尝试过
hmzhmz 2012-11-16
  • 打赏
  • 举报
回复
引用 11 楼 adophper 的回复:
可以参考Thinkphp 的做法!rbac,很方便的管理后台权限!
我用的是CI框架
acabin 2012-11-15
  • 打赏
  • 举报
回复
没什么啊,对用户组授权,然后判断用户的用户组进行全选赋予. 鉴于你的权限不继承,只要判断当前模块id的权限就可以了,很简单的
超级字帖 2012-11-15
  • 打赏
  • 举报
回复
可以参考Thinkphp 的做法!rbac,很方便的管理后台权限!
acabin 2012-11-15
  • 打赏
  • 举报
回复
槽点太多………… 首先,你难道没有内存缓存? 文件缓存的性能当然低下了啊 第二,修改成数组的时候,你后面做的根本不是位运算 位运算是这个形式的: $calcRight = 0; foreach($rights as $right) $calcRight |= 1 << $right; 然后比较的时候 if($calcRight & $your_right) { //有授权 } else { //无授权 } 第三,数据库有压力,则进行缓存,内存缓存,别弄文件型的,毫无性能可言。
hmzhmz 2012-11-15
  • 打赏
  • 举报
回复
然后在每个模块做位运算,但是性能上还是不理想
hmzhmz 2012-11-15
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
引用 5 楼 hmzhmz1115 的回复: 引用 4 楼 xuzuning 的回复:如果可怜数据库的压力太大 那么就不要做什么权限了 一个没有权限分割的系统为几百人甚至千人提供服务,那样没法用呀。数据库的压力控制合理即可,关键就是在寻找平衡数据库压力的方法,求好的数据结构,好的权限设计代码思路这么说,还有讨论的余地 你可以在每个用户登录时读取该用户对各个模块的权限,保存于session中……
我做的解决方案是把权限ID,用户组ID,模块ID三个字段关联到一张表中设为A表,然后在写一个权限类,在用户登录成功时自动运行,读出该用户所在组的所有权限数据。读出的样式是 Array ( [0] => Array ( [mod_id] => 1 [right_id] => 1 [group_id] => 1 ) [1] => Array ( [mod_id] => 1 [right_id] => 2 [group_id] => 1 ) [2] => Array ( [mod_id] => 1 [right_id] => 3 [group_id] => 1 ) [3] => Array ( [mod_id] => 1 [right_id] => 4 [group_id] => 1 ) [4] => Array ( [mod_id] => 2 [right_id] => 1 [group_id] => 1 ) [5] => Array ( [mod_id] => 2 [right_id] => 2 [group_id] => 1 ) [6] => Array ( [mod_id] => 3 [right_id] => 1 [group_id] => 1 ) ....... 然后修改数组的格式 array( [mod_id] = 2^right_id + 2^right_id ...... ); 把该数组写入文件中保存 用户需要判断权限是就加载自己用户组下的这个权限临时文件
xuzuning 2012-11-15
  • 打赏
  • 举报
回复
引用 5 楼 hmzhmz1115 的回复:
引用 4 楼 xuzuning 的回复:如果可怜数据库的压力太大 那么就不要做什么权限了 一个没有权限分割的系统为几百人甚至千人提供服务,那样没法用呀。数据库的压力控制合理即可,关键就是在寻找平衡数据库压力的方法,求好的数据结构,好的权限设计代码思路
这么说,还有讨论的余地 你可以在每个用户登录时读取该用户对各个模块的权限,保存于session中备查 如果感到模块太多,则只保存对一级模块的权限。进入模块后,再检索子模块的权限
hmzhmz 2012-11-15
  • 打赏
  • 举报
回复
本系统是指web方向的系统软件开发
加载更多回复(4)

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧