94hwan框架的权限控制方式主要通过利用 cls_access 拦截ct和ac信息来实现,在项目内部,代码如下:
- $config_pool_name = 'administrator';
- $config_appname = 'admin';
- $config_cp_url = '?ct=index&ac=login';
-
- $config_access_ctl = cls_access::factory( $config_pool_name, $config_cp_url );
- $config_access_ctl->test_purview( cls_request::$forms['ct'], cls_request::$forms['ac'], '1' );
这需代码需要在入口文件(通常是 index.php)execute_ctl 之前放置,
如果要进行一些特殊操作,如:用户未审核需要进行一些警告或不允许登录,也可以通过cls_access的对象实例,获取用户信息后在这个入口文件进行处理。
使用 cls_access::factory 初始化对象实例后,会保留一个引用的副本在 public static $accctl,项目内部可以用:
$acc_ctl = cls_access::get_instance();
这种方式来获得这个对象实例
一、cls_access 主要功能及成员函数如下:
1、public function check_user($loginuser, $loginpwd, $keeptime=0)
用于验证用户登录(通常用于登录程序),如:
- $accctl = cls_access::get_instance();
$rs = $accctl->check_user(cls_request::item('username'), cls_request::item('password'));
- $gourl = cls_request::item('gourl', '');
- if( $rs == 1 )
- {
- $jumpurl = emptyempty($gourl) ? "?ct=".cls_request::item('oldct')."&ac=".cls_request::item('oldac') : $gourl;
- cls_access::show_message ('成功登录', '成功登录,现在转向你在登录前访问的页面!', $jumpurl);
- exit();
- } else {
- cls_access::show_message ('登录失败', '可能密码或用户名不正确,请重新进行登录!', '-1');
- exit();
- }
2、public function test_purview($mod, $action, $backtype='1')
测试用户是否对当前操作有权限
$backtype = 1 表示没有权限时,由权限类直接处理验证登录后的位置
$backtype = 2 任何情况都只返回状态码,由用户自行处理
3、public function get_userinfos()
获得用户的个人信息(仅是 users 表的内容)
4、public static function show_message ($title, $msg, $gourl, $limittime=3000)
显示一个简单的对话框,等同于:cls_msgbox::show($title, $msg, $gourl, $limittime);
5、public function loginout()
退出登录(仅删除登录会话信息,不理会后续操作)
6、public static function factory($poolname, $cp_url='')
用工厂的方法创建对象实例
$poolname 是指用户的应用池(配置文件在 config/inc_accesscontrol.php)
$cp_url 是用户超时或未登录转到的地址(即是相当于 $acc_pools[$poolname]['control'] )
7、public static function get_instance()
获得由工厂方法创建的对象实例副本
8、public static function get_login_infos($uid)
获得指定用户的上次登录IP和时间
二、关于权限类的相关配置及原理
权限类的原理很简单,在没指定任何配置的情况下,用户是没有任何权限的,因此只需要配置文件指定用户能访问那些控制器和事件,即可达到权限控制的目的,这里涉及几个配置。
1、池权限配置
池权限的配置是一个整体的配置,用于标识项目中有多少个隔离的应用池
配置文件为:config/inc_accesscontrol.php
下面是一个标准的配置:
-
- $config['access_groups'] = array(
- 'administrator_admin' => array('name'=>'管理员--超级管理员','pools'=>'administrator'),
- 'administrator_test' => array('name'=>'管理员--测试组','pools'=>'administrator'),
- 'member_normal' => array('name'=>'网站会员--普通会员','pools'=>'member')
- );
-
-
-
- 指定这个应用池的用户能否访问其它应用
-
- $acc_pools['administrator']['allowpool'] = '';
-
- 在用户未登录的情况下可以访问的应用(通常是登录、注册、取回密码之类)
- $acc_pools['administrator']['allowmod'] = array('index-login', 'index-dologin', 'index-loginout');
-
- 认证模式(session或cookie)
- $acc_pools['administrator']['auttype'] = 'session';
-
- 登录页地址
- $acc_pools['administrator']['control'] = '?ct=index&ac=login';
-
-
- $acc_pools['member']['allowpool'] = '';
- $acc_pools['member']['allowmod'] = array('index-login', 'index-dologin', 'index-loginout', 'index-register',
- 'index-doregister', 'index-get_password', 'index-test_userid');
- $acc_pools['member']['auttype'] = 'session';
- $acc_pools['member']['control'] = '?ct=index&ac=login';
2、组限配置
组权限配置文件在 config/inc_accesscontrol_groups.php
-
- global $acc_groups;
- $acc_groups = array();
-
-
- #<start_config>
-
- $acc_groups['administrator']['admin'] = '*';
- $acc_groups['administrator']['test'] = '*';
-
- $acc_groups['member']['normal'] = '*';
-
- #<end_config>
在 users 表中的 groups 实际上是 administrator_admin 这样的值,当 $acc_geoups 的配置值为 * 时表示可访问当前池的任何应用
否则用 "ctvalue1-acvalue1, ctvalue2-acvalue2..."这样的形式表示用户可访问的具体操作。
如果你想对某用户设置单独的权限,只需把类似的值保存到 users_purview 表即可
至于在后台的具体操作,只是对这个类的配置更改的实现而已,具体还要需符合这个类的用法。
|