Rbac.php

浏览该文件的文档。
00001 <?php
00003 // FleaPHP Framework
00004 //
00005 // Copyright (c) 2005 - 2007 FleaPHP.org (www.fleaphp.org)
00006 //
00007 // 许可协议,请查看源代码中附带的 LICENSE.txt 文件,
00008 // 或者访问 http://www.fleaphp.org/ 获得详细信息。
00010 
00030 class FLEA_Rbac
00031 {
00037     var $_sessionKey = 'RBAC_USERDATA';
00038 
00044     var $_rolesKey = 'RBAC_ROLES';
00045 
00051     function FLEA_Rbac()
00052     {
00053         $this->_sessionKey = FLEA::getAppInf('RBACSessionKey');
00054         if ($this->_sessionKey == 'RBAC_USERDATA') {
00055             trigger_error(_ET(0x0701005), E_USER_WARNING);
00056         }
00057     }
00058 
00065     function setUser($userData, $rolesData = null)
00066     {
00067         if ($rolesData) {
00068             $userData[$this->_rolesKey] = $rolesData;
00069         }
00070         $_SESSION[$this->_sessionKey] = $userData;
00071     }
00072 
00078     function getUser()
00079     {
00080         return isset($_SESSION[$this->_sessionKey]) ?
00081                 $_SESSION[$this->_sessionKey] :
00082                 null;
00083     }
00084 
00088     function clearUser()
00089     {
00090         unset($_SESSION[$this->_sessionKey]);
00091     }
00092 
00098     function getRoles()
00099     {
00100         $user = $this->getUser();
00101         return isset($user[$this->_rolesKey]) ?
00102                 $user[$this->_rolesKey] :
00103                 null;
00104     }
00105 
00111     function getRolesArray()
00112     {
00113         $roles = $this->getRoles();
00114         if (is_array($roles)) { return $roles; }
00115         $tmp = array_map('trim', explode(',', $roles));
00116         return array_filter($tmp, 'trim');
00117     }
00118 
00127     function check(& $roles, & $ACT)
00128     {
00129         $roles = array_map('strtoupper', $roles);
00130         if ($ACT['allow'] == RBAC_EVERYONE) {
00131             // 如果 allow 允许所有角色,deny 没有设置,则检查通过
00132             if ($ACT['deny'] == RBAC_NULL) { return true; }
00133             // 如果 deny 为 RBAC_NO_ROLE,则只要用户具有角色就检查通过
00134             if ($ACT['deny'] == RBAC_NO_ROLE) {
00135                 if (empty($roles)) { return false; }
00136                 return true;
00137             }
00138             // 如果 deny 为 RBAC_HAS_ROLE,则只有用户没有角色信息时才检查通过
00139             if ($ACT['deny'] == RBAC_HAS_ROLE) {
00140                 if (empty($roles)) { return true; }
00141                 return false;
00142             }
00143             // 如果 deny 也为 RBAC_EVERYONE,则表示 ACT 出现了冲突
00144             if ($ACT['deny'] == RBAC_EVERYONE) {
00145                 FLEA::loadClass('FLEA_Rbac_Exception_InvalidACT');
00146                 __THROW(new FLEA_Rbac_Exception_InvalidACT($ACT));
00147                 return false;
00148             }
00149 
00150             // 只有 deny 中没有用户的角色信息,则检查通过
00151             foreach ($roles as $role) {
00152                 if (in_array($role, $ACT['deny'], true)) { return false; }
00153             }
00154             return true;
00155         }
00156 
00157         do {
00158             // 如果 allow 要求用户具有角色,但用户没有角色时直接不通过检查
00159             if ($ACT['allow'] == RBAC_HAS_ROLE) {
00160                 if (!empty($roles)) { break; }
00161                 return false;
00162             }
00163 
00164             // 如果 allow 要求用户没有角色,但用户有角色时直接不通过检查
00165             if ($ACT['allow'] == RBAC_NO_ROLE) {
00166                 if (empty($roles)) { break; }
00167                 return false;
00168             }
00169 
00170             if ($ACT['allow'] != RBAC_NULL) {
00171                 // 如果 allow 要求用户具有特定角色,则进行检查
00172                 $passed = false;
00173                 foreach ($roles as $role) {
00174                     if (in_array($role, $ACT['allow'], true)) {
00175                         $passed = true;
00176                         break;
00177                     }
00178                 }
00179                 if (!$passed) { return false; }
00180             }
00181         } while (false);
00182 
00183         // 如果 deny 没有设置,则检查通过
00184         if ($ACT['deny'] == RBAC_NULL) { return true; }
00185         // 如果 deny 为 RBAC_NO_ROLE,则只要用户具有角色就检查通过
00186         if ($ACT['deny'] == RBAC_NO_ROLE) {
00187             if (empty($roles)) { return false; }
00188             return true;
00189         }
00190         // 如果 deny 为 RBAC_HAS_ROLE,则只有用户没有角色信息时才检查通过
00191         if ($ACT['deny'] == RBAC_HAS_ROLE) {
00192             if (empty($roles)) { return true; }
00193             return false;
00194         }
00195         // 如果 deny 为 RBAC_EVERYONE,则检查失败
00196         if ($ACT['deny'] == RBAC_EVERYONE) {
00197             return false;
00198         }
00199 
00200         // 只有 deny 中没有用户的角色信息,则检查通过
00201         foreach ($roles as $role) {
00202             if (in_array($role, $ACT['deny'], true)) { return false; }
00203         }
00204         return true;
00205     }
00206 
00214     function prepareACT($ACT)
00215     {
00216         $ret = array();
00217         $arr = array('allow', 'deny');
00218         foreach ($arr as $key) {
00219             do {
00220                 if (!isset($ACT[$key])) {
00221                     $value = RBAC_NULL;
00222                     break;
00223                 }
00224 
00225                 if ($ACT[$key] == RBAC_EVERYONE || $ACT[$key] == RBAC_HAS_ROLE
00226                     || $ACT[$key] == RBAC_NO_ROLE || $ACT[$key] == RBAC_NULL) {
00227                     $value = $ACT[$key];
00228                     break;
00229                 }
00230 
00231                 $value = explode(',', strtoupper($ACT[$key]));
00232                 $value = array_filter(array_map('trim', $value), 'trim');
00233                 if (empty($value)) { $value = RBAC_NULL; }
00234             } while (false);
00235             $ret[$key] = $value;
00236         }
00237 
00238         return $ret;
00239     }
00240 }

Generated at Sat Feb 2 15:18:51 2008 for FleaPHP by  doxygen 1.5.3