字体:  

[讨论]企业内部网的权限设置

kind.huang 发表于: 2008-8-28 09:33 来源: PHPChina 开源社区门户

是按功能分配权限还是按其他方式分配权限
如按功能分配那如何知道某个URL是什么功能,用URL传功能代号?

举例用户管理的功能,有三个文件:
userlist.php
useradd.php
useredit.php
这里有四个功能
1.用户列表,对应文件userlist.php
2.用户删除,对应文件userlist.php
3.用户增加,对应文件useradd.php
4.用户修改,对应文件useredit.php

如有兴趣说说请用此例

最新回复

leric at 2008-8-28 09:46:01
估计这也是REST的好处之一吧
应用一下MVC,这个问题就比较好解决了
dmlk31 at 2008-8-28 11:10:29
user.php
<?php

if( $act == 'add' ){
    valid_admin_privilege('user.php','add');
    //业务逻辑代码
}

elseif( $act == 'edit' ){
    valid_admin_privilege('user.php','edit');
    //业务逻辑代码
}

elseif( $act == 'list' ){
    valid_admin_privilege('user.php','list');
    //业务逻辑代码
}
?>

<?php
/**
* 该管理员的权限
*/
$_PRIV = array(
    'user.php_add'=>'1',
    'user.php_list'=>'1',
    '...'=>'...'
)
function valid_admin_privilege($module,$act)
{
    global $_PRIV;

    if( $_PRIV[$module.'_'.$act] != 1 ) exit();
}
?>

这个是我那套基于角色和细粒度的分级权限系统的最最简单的模型,你看看可能帮助。

[ 本帖最后由 dmlk31 于 2008-8-28 11:16 编辑 ]
kind.huang at 2008-8-28 11:39:15
$act是从URL中取得?
$_PRIV反应到数据库中大概就是:
user_id,module_id,act_id

请问是这样吗?
dmlk31 at 2008-8-28 11:59:19
是的.user.php?act=add

简化版数据库

模块表 module(module_id,name,file)
权限表 privilege(privilege_id,name,module_id,module_act_code,module_act_name)
管理员权限表 admin_privilege(admin_id,privilege_id)

$_PRIV是在登陆时初始化array(
     $file.'_'.$module_act_code=>'1'
)

[ 本帖最后由 dmlk31 于 2008-8-28 12:01 编辑 ]
kind.huang at 2008-8-28 13:50:49
怎么"权限表"没有和用户或角色关联?
dmlk31 at 2008-8-28 13:57:22
这个没有角色,只有管理员直接联系权限,如果要实现角色那么加个表role和admin_role
tianxj at 2008-8-28 15:16:40
偷懒的方法:在功能块中做判断
kind.huang at 2008-8-28 16:21:37
模块表 module(module_id,name,file)
权限表 privilege(privilege_id,name,module_id,module_act_code,module_act_name)
管理员权限表 admin_privilege(admin_id,privilege_id)

这里为什么不直接用admin_id和module_id关联,而要多个权限表?
dmlk31 at 2008-8-28 16:47:30
关联module_id,那么这个权限系统就只能控制到模块,即管理员拥有模块的所有管理权限,而不能实现管理员拥有模块的增加权限,或者模块的其他权限
kind.huang at 2008-8-28 17:18:13
哦,也就是细分到增加,修改,删除的active上

这个权限系统和单一入口系统结合,其网址大概为:index.php?module=file&active=module_act_code
那如果和非单一入口系统结合,那怎么判断当前页面的权限呢,也用URL传值吗?
dmlk31 at 2008-8-28 17:35:23
呵呵,还有一种模式

module1.php
<?php
require('../include/init.php');

//其他业务代码
?>

module2.php
<?php
require('../include/init.php');

//其他业务代码
?>

访问采用
module1.php?act=xxx
module2.php?act=xxx

每个受保护的文件都加载init.php文件,init.php负责加载通用信息以及未登录的强制跳转。
而权限判断则放在其他业务代码里。

[ 本帖最后由 dmlk31 于 2008-8-28 17:36 编辑 ]
kind.huang at 2008-8-29 08:35:48
非常感谢
dmlk31 at 2008-8-29 08:53:48
拷出部分源码你看看
init.php


//模块 - 文章模块
article.php


未命名.jpg



[ 本帖最后由 dmlk31 于 2008-8-29 09:09 编辑 ]
peacock at 2008-8-29 09:31:03
模块权限->功能权限->数据权限