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 表即可

至于在後台的具體操作,只是對這個類的配置更改的實現而已,具體還要需符合這個類的用法。

...