94hwan-PHP框架基本原理

Source:94hwan 与众不同  Author:网络部
2010-02-26 15:14

94hwan框架的权限控制方式主要通过利用 cls_access 拦截ct和ac信息来实现,在项目内部,代码如下:

  1. $config_pool_name = 'administrator';       //应用池参数(与权限管理有关) 
  2. $config_appname   = 'admin';       //应用名称(与模板文件夹有关,不一定与应用池名称一致) 
  3. $config_cp_url = '?ct=index&ac=login';     //用于未登录用户跳转到的url
  4. //前置的权限控制器 
  5. $config_access_ctl = cls_access::factory( $config_pool_name$config_cp_url ); 
  6. $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)
用于验证用户登录(通常用于登录程序),如:

  1. $accctl = cls_access::get_instance(); 
    $rs = $accctl->check_user(cls_request::item('username'), cls_request::item('password')); 
  2. $gourl = cls_request::item('gourl'''); 
  3. if$rs == 1 ) 
  4.      $jumpurl = emptyempty($gourl) ? "?ct=".cls_request::item('oldct')."&ac=".cls_request::item('oldac') : $gourl
  5.      cls_access::show_message ('成功登录''成功登录,现在转向你在登录前访问的页面!'$jumpurl); 
  6.      exit(); 
  7. else {
  8.      cls_access::show_message ('登录失败''可能密码或用户名不正确,请重新进行登录!', '-1'); 
  9.      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
下面是一个标准的配置:

 

  1. //组类型 
  2. $config['access_groups'] = array
  3.     'administrator_admin' => array('name'=>'管理员--超级管理员','pools'=>'administrator'), 
  4.     'administrator_test' => array('name'=>'管理员--测试组','pools'=>'administrator'), 
  5.     'member_normal' => array('name'=>'网站会员--普通会员','pools'=>'member'
  6. ); 
  7.  
  8. //管理员应用池 
  9.  
  10. 指定这个应用池的用户能否访问其它应用 
  11. //$acc_pools['administrator']['allowpool'] = array('member'); 
  12. $acc_pools['administrator']['allowpool'] = ''
  13.  
  14. 在用户未登录的情况下可以访问的应用(通常是登录、注册、取回密码之类)
  15. $acc_pools['administrator']['allowmod'] = array('index-login''index-dologin''index-loginout'); 
  16.  
  17. 认证模式(session或cookie) 
  18. $acc_pools['administrator']['auttype'] = 'session'
  19.  
  20. 登录页地址 
  21. $acc_pools['administrator']['control'] = '?ct=index&ac=login'
  22.  
  23. //会员应用池 
  24. $acc_pools['member']['allowpool'] = ''
  25. $acc_pools['member']['allowmod'] = array('index-login''index-dologin''index-loginout''index-register'
  26.                                          'index-doregister''index-get_password''index-test_userid'); 
  27. $acc_pools['member']['auttype'] = 'session'
  28. $acc_pools['member']['control'] = '?ct=index&ac=login'

2、组限配置
组权限配置文件在 config/inc_accesscontrol_groups.php

  1. //各用户组的具体许可权限 
  2. global $acc_groups
  3. $acc_groups = array(); 
  4. //@start_config 不要改动下面<>结构 
  5.  
  6. #<start_config> 
  7.  
  8. $acc_groups['administrator']['admin'] = '*'
  9. $acc_groups['administrator']['test'] = '*'
  10.  
  11. $acc_groups['member']['normal'] = '*'
  12.  
  13. #<end_config> 

在 users 表中的 groups 实际上是 administrator_admin 这样的值,当 $acc_geoups 的配置值为 * 时表示可访问当前池的任何应用
否则用 "ctvalue1-acvalue1, ctvalue2-acvalue2..."这样的形式表示用户可访问的具体操作。
如果你想对某用户设置单独的权限,只需把类似的值保存到 users_purview 表即可

至于在后台的具体操作,只是对这个类的配置更改的实现而已,具体还要需符合这个类的用法。

...