SpeedPHP技术交流论坛

 找回密码
 论坛注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 734|回复: 8

请高手和解答关于权限控制中的几点疑问 [复制链接]

Rank: 4

发表于 2010-9-2 13:42:46 |显示全部楼层
项目基本描述:
项目有两上入口分别为index.php(网站前台程序)和admin.php(网站后台程序)其中index.php页面开启的是有限权限控制在admin.php中开启的是强制权限控制。index.php中controller_path为默认的controller在admin设置的是自定义的目录mcontroller_path基本情况如下。现有几点疑问请高手解答

1.在spACL中SPANONYMOUS如何设置。目的:在强制权限控制中所有的C和A都会检测。但个别的C和A是不需要检测的。比如后台的登录。
2.在spAcl中spAclModel类的check返回-1有什么用?
3.因为sp_acl表中被检测的字段为controller和action 如果在admin.php和index.php中有相同的C和A是权限检测是如何区别的?

管理员

@speedphp

Rank: 9Rank: 9Rank: 9

发表于 2010-9-2 14:08:48 |显示全部楼层
1,SPANONYMOUS就是专门为了不需要检测的c/a而设置的。比如说登录页面c/a是main/login,那么在权限表acl中,就有一条这样的记录
id|main|login|SPANONYMOU
也就是角色字段使用SPANONYMOU的c/a,就不需要检测权限。

2,check的返回值,可以查看spAcl文件内说明
         * 返回1是通过检查,0是不能通过检查(控制器及动作存在但用户标识没有记录)
         * 返回-1是无该权限控制(即该控制器及动作不存在于权限表中)

3,admin.php和index.php,这样就是“两个应用程序”,那么理论上两个应用程序的表前缀(prefix)应该都是不同的,而acl表的acl是固定的,要区分就要有不同的表前缀。
比如说admin(表前缀是admin_)的是建立 admin_acl表, index(表前缀是index_)的是建立index_acl表,即可。

Rank: 4

发表于 2010-9-2 14:19:33 |显示全部楼层
前两条没有问题,如何为ACL单独建一张表。在配置文件里要如何写呢?

Rank: 4

发表于 2010-9-2 14:21:32 |显示全部楼层
别的表我想公用。只有这一张表要如何单独出来呢?

管理员

@speedphp

Rank: 9Rank: 9Rank: 9

发表于 2010-9-2 14:25:58 |显示全部楼层
每个应用程序,配置里面的db - prefix都是可以设置的
admin的(建表admin_acl)
$spConfig = array(
        "db" => array( // 数据库设置
                'host' => 'localhost',  // 数据库地址,一般都可以是localhost
                'login' => 'root', // 数据库用户名
                'password' => '123456', // 数据库密码
                'database' => 'test', // 数据库的库名称
                'prefix' => 'admin_',           // 表前缀
        ),
);
index的(建表 index_acl)
$spConfig = array(
        "db" => array( // 数据库设置
                'host' => 'localhost',  // 数据库地址,一般都可以是localhost
                'login' => 'root', // 数据库用户名
                'password' => '123456', // 数据库密码
                'database' => 'test', // 数据库的库名称
                'prefix' => 'index_',           // 表前缀
        ),
);

Rank: 4

发表于 2010-9-2 14:32:01 |显示全部楼层
整个应用程序是这样配置的。能单独为某一个表配置前辍吗?

Rank: 4

发表于 2010-9-2 14:37:45 |显示全部楼层
其实只要acl_name前台和后台不相同也不会冲突。能单独为某一个表设置前辍吗?

Rank: 4

发表于 2010-9-2 15:45:24 |显示全部楼层
LZ考虑自己重新写下权限验证类吧。
这样或许适合你的要求。
我自己建立了个表,为group表,然后再group的model中写了个函数
  1. public function check($gid,$controller, $action)
  2. {
  3.         if($controller == 'user' && ($action == 'login' || $action == 'logout')) return 1; //设置全局允许的控制器,方法
  4.         if(in_array($_SESSION['u_id'],$GLOBALS['G_SP']['site_config']['admin'])) return 1; //设置管理员权限
  5.         if($r = $this->spCache(3600)->find(array('gid'=>$gid)))
  6.         {
  7.                 //在此判断具体的用户组权限
  8.         }
  9.         else
  10.         {
  11.                 return -1;
  12.         }
  13. }
复制代码


然后配置文件修改下:
  1. 'ext' => array(
  2.                 'spAcl' => array(
  3.                         'prompt' => array("mod_group", "acljump"),
  4.                         'checker' => array('mod_group','check'),
  5.                 ),
复制代码


这样就可以考虑一个表存储了,关键是你的check函数根据你的需要自己写个合适的。

管理员

@speedphp

Rank: 9Rank: 9Rank: 9

发表于 2010-9-2 17:30:56 |显示全部楼层
其实只要acl_name前台和后台不相同也不会冲突。能单独为某一个表设置前辍吗? ...
wjm7301 发表于 2010-9-2 14:37


可以,只要前台和后台中,需要设置权限的c/a名称不相同就行。


LZ考虑自己重新写下权限验证类吧。
这样或许适合你的要求。
我自己建立了个表,为group表,然后再group的mo ...
xd04053045 发表于 2010-9-2 15:45



很不错,spAcl本身功能的确有限,在此基础上加以扩展是很好的思路和做法。
您需要登录后才可以回帖 登录 | 论坛注册

Archiver|SpeedPHP.com ( 粤ICP备08008671号 )  

GMT+8, 2012-2-7 01:00

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部