首頁 > 後端開發 > php教程 > acrobat professional 9.0 php中實作簡單的ACL 結束篇

acrobat professional 9.0 php中實作簡單的ACL 結束篇

WBOY
發布: 2016-07-29 08:46:42
原創
947 人瀏覽過

複製程式碼程式碼如下:


-- ACL Tables
-- 表的結構`aclresources`
DROP TABLE IF EXISTS `aclresources``; `aFt. ` varchar(64) NOT NULL,
`access` int(4) NOT NULL 預設0,
`desc` varchar(240) NOT NULL 預設'',
` create_at` int(10) unsigned NOT NULL 預設1,
`updated_at` int(10) unsigned NOT NULL 預設0,
PRIMARY KEY (`rsid`)
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- 表的結構`aclroDR `aclroDR如果不存在`aclroles` 則建立表格(
`id` int(10) unsigned NOT NULL auto_increment,
`rolename` varchar(32) NOT NULL ,
`desc` varchar(240) NOT''ULL default `desc` varchar(240) NOT_ created_at` int(10) unsigned NOT NULL default 1,
`updated_at` int(10) unsigned NOT NULL default 0,
PRIMARY KEY (`id`),
UNIQUE KEY `roname ``roname)(集=utf8 COLLATE=utf8_unicode_ci;
-- 表的結構`ref_aclresources_aclroles`
DROP TABLE IF EXISTS `ref_aclresources_aclroles`;
如果不存在`ref_aclresources_``fclles_`Fs(Fust_Fids_``ref_aclus_`"clroles_`as(Mvari_`Fs(Fust_aFids_``.
`role_id ` int(10) unsigned NOT NULL,
PRIMARY KEY (`rsid`,`role_id`)
)預設字元集= utf8 COLLATE=utf8_unicode_ci;
-- 表的結構`ref_users_aclroDR` LEles 表的結構`ref_users_aclroDR` LEles 表的結構``scon(sclrot)
如果不存在則建立表格`ref_users_aclroles` (
`user_id` int(10) unsigned NOT NULL auto_increment,
`role_id` int(10) unsigned NOT NULL ,
`role_id` int(10) unsigned NOT NULL ,
`role_id` int(10) unsigned NOT NULL ,
`7,
,Y DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- 表的結構`users`
DROP TABLE IF EXISTS `users`;
建立表`users` (
`id` int(10) )( varchar(128) NOT NULL,
`password` varchar(64) NOT NULL,
`nickname` varchar(32) NOT NULL 預設'',
`roles` varchar(240) NOT NULL 預設'',
`created_at` int(10) unsigned NOT NULL 預設1,
`updated_at` int(10) unsigned NOT NULL 預設0,
PRIMARY KEY (`id`),
唯一金鑰`user_email` (`email`)
)預設字元集=utf8 COLLATE=utf8_unicode_ci;


php類別



複製程式碼

程式碼如下:


/**
* 簡單的ACL 權限控制功能
*
* 表定義
*
* 1. 資源定義(rsid,access,desc,created_at,updated_at)
* 2. 角色定義(id,rolename,desc,created_at)
* 2. 角色定義(id,rolename,desc,created_at),upat_at)
* 3. 資源-角色關聯(rsid,role_id)
* 4. 使用者-角色關聯(user_id,role_id)
*
* 依賴db.php sqlobject.php
*
* @authoru.*/
class AclBase {
// --- ACL 存取授權
/**
* 不允許任何人存取
*/
const NOBODY = 0;
/**
* 允許任何人存取
*/
const EVERYONE = 1;
/**
* 允許 擁有角色的使用者存取
*/
const HAS_ROLE = 2;
/**
* 允許 不帶有角色的使用者存取
*/
const NO_ROLE = 3;
/**
* 在 資源-角色關聯 定義的 角色才能存取
*/
const ALLOCATE_ROLES = 4;
// 定義相關的表名
public $tbResources = 'aclresources';
public $tbRoles = 'aclroles';
public $tbRefResourcesRoles = 'ref_aclresources_aclroles';
public $tbRefUsersRoles = 'ref_users_aclroles';
/**
* 格式化 資源的存取權限並傳回
*
* @return int
*/
靜態函數 formatAccessValue($access){
靜態 $arr = array(self::NOBODY,self::EVERYONE,self::HAS_ROLE,self::NO_ROLE,self::ALLOCATE_ROLES) ;
返回 in_array($access,$arr) ?
}
/**
* 建立資源,回傳資源記錄主鍵
*
* @param string $rsid
* @param int $access
* @param string $desc
*
* @return int
*/
function createResource($rsid,$access,$desc){
if (empty($rsid)) return false;
$resource = array(
'rsid' => $rsid,
'access' => self::formatAccessValue($access),
'desc' => $desc,
'created_at' => CURRENT_MESTMEST 對
); return SingleTableCRUD::insert($this->tbResources,$resource)
}
/**
* 修改資源,返回成功狀態
*
* @param array $resource
* @return int
*/
function updateResource(array $resource){
if (!isset($resource['rsid']); ) return false;
$resource['updated_at'] = CURRENT_TIMESTAMP;
return SingleTableCRUD::update($this->tbResources,$resource,'rsid');
/**
* 刪除資源
*
* @param string $rsid
* @return int
*/Resource (cdelete/Resource( rsid){
if (empty($rsid)) return false;
return SingleTableCRUD::delete($this->tbResources,array('rsid'=>$rsid)); &*/
function createRole($rolename, $desc){
if (empty($rolename)) return false;
$role = array(
'rolename' => $rolename,
'desc' => $desc,
'created_at' =at'at' = CURRENT_TI);
return SingleTableCRUD::insert($this->tbRoles,$role);
/**
* 建立角色,返回角色記錄主鍵
*
* @param string $rolename
* @param string $desc
*
* @return int
*/
function updateRole(array $role){
if ( !isset($role['id'])) return false;
if (isset($role['rolename'])) unset($role['rolename']);
$role['updated_at'] = CURRENT_TIMESTAMP ;
return SingleTableCRUD::update($this->tbRoles,$role,'id');
}
/**
* 修改角色,返回成功狀態
*
* @param array $role
* @return int
*/
function deleteRole($role_id){
if (empty($role_id)) return false;
return SingleTableCRUD::delete($this->tbRoles,array('role_id'=>(int) $role_id));
}
/**
* 刪除角色
*
* @param int $role_id
* @return int
*/
function allocateRolesForResource($rsid,$roleIds,$setNull=false,$defaultAccess=-1){
if (empty($rsid)) return false;
$roleIds = 標準化($roleIds,',');
if (empty($roleIds)){
if ($setNull){
SingleTableCRUD::delete($this->tbRefResourcesRoles,array('rsid'=>$rsid));
if ($defaultAccess != -1){
$defaultAccess = self::formatAccessValue($defaultAccess);
$this->updateResource(array('rsid'=>$rsid,'access'=>$defaultAccess));
}
回傳 true;
}
回傳 false;
}
SingleTableCRUD::delete($this->tbRefResourcesRoles,array('rsid'=>$rsid));
$roleIds = array_unique($roleIds);
foreach ($roleIds as $role_id){
SingleTableCRUD::insert($this->tbRefResourcesRoles,array('rsid'=>$rsid,'role_id'=>(int)$role_id));
}
回傳 true;
}
function cleanRolesForResource($rsid){
if (empty($rsid)) return false;
return SingleTableCRUD::delete($this->tbRefResourcesRoles,array('rsid'=>$rsid));
}
function cleanResourcesForRole($role_id){
if (empty($role_id)) return false;
return SingleTableCRUD::delete($this->tbRefResourcesRoles,array('role_id'=>(int) $role_id));
}
/**
* 為角色分配資源,每次均先全部移除表中相關記錄再插入
*
* @param int $role_id
* @param mixed $rsids
*
* @return boolean
*/
function allocateResourcesForRole($role_id,$rsids){
if (empty($role_id)) return false;
$role_id = (int) $role_id;
$rsids = 標準化($rsids,',');
if (空($rsids)){
回傳 false;
}
SingleTableCRUD::delete($this->tbRefResourcesRoles,array('role_id'=>$role_id));
$rsids = array_unique($rsids);
foreach ($rsids as $rsid){
SingleTableCRUD::insert($this->tbRefResourcesRoles,array('rsid'=>$rsid,'role_id'=>$role_id));
}
回傳 true;
}
/**
* 為使用者指派角色,每次均先全部移除表中相關記錄再插入
*
* 此處在使用者很多的時候可能會有效能問題... 後面再想怎麼優化
*
* @param int $user_id
* @param mixed $roleIds
*
* @return boolean
*/
function allocateRolesForUser($user_id,$roleIds){
if (empty($user_id)) return false;
$user_id = (int) $user_id;
$roleIds = 標準化($roleIds,',');
if (空($roleIds)){
回傳 false;
}
SingleTableCRUD::delete($this->tbRefUsersRoles,array('user_id'=>$user_id));
$roleIds = array_unique($roleIds);
foreach ($roleIds as $roleId){
SingleTableCRUD::insert($this->tbRefUsersRoles,array('user_id'=>$user_id,'role_id'=>$role_id));
}
回傳 true;
}
/**
* 清除使用者的角色資訊
*
* @param int $user_id
*
* @return boolean
*/
function cleanRolesForUser($user_id){
if (empty($user_id)) return false;
return SingleTableCRUD::delete($this->tbRefUsersRoles,array('user_id'=>(int) $user_id));
}
/**
* 清除角色的使用者關聯
*
* @param int $role_id
*
* @return boolean
*/
function cleanUsersForRole($role_id){
if (empty($role_id)) return false;
return SingleTableCRUD::delete($this->tbRefUsersRoles,array('role_id'=>(int) $role_id));
}
}


具體檢測的代碼如下:

複製代碼代碼如下:


/**
* 對資源進行acl校驗
*
* @param string $rsid 資源識別
* @param array $user 特定使用者,不指定則校驗目前使用者
*
* @return boolean
*/
function aclVerity($rsid ,array $user = null){
如果(空($rsid))回傳假;
if (!CoreApp::$defaultAcl) {
CoreApp::$defaultAcl = new AclFlat();
}
$rsRow = aclGetResource($rsid);
// 未定義資源的存取策略
if (!$rsRow) return false;
CoreApp::writeLog($rsRow,'test');
$rsRow['access'] = AclBase::formatAccessValue($rsRow['access']);
// 允許任何人存取
if (AclBase::EVERYONE == $rsRow['access']) return true;
// 允許任何人訪問
if (AclBase::NOBODY == $rsRow['access']) return false;
// 取得使用者資訊
if (empty($user)) $user = isset($_SESSION['SI-SysUser']) ? $_SESSION['SI-SysUser'] : null;
//使用者未登錄,則當成為無存取權限
if (empty($user)) return false;
$user['roles'] = 空($user['roles']) ? null : 標準化($user['角色'],';');
$userHasRoles = !empty($user['roles']);
/**
* 允許 不帶有角色的使用者存取
*/
if (AclBase::NO_ROLE == $rsRow['access']) 回傳 $userHasRoles ? == $rsRow['access']) 回傳$userHasRoles ?
// --- 對使用者進行資源 角色校驗
if ($userHasRoles){
foreach ($user['roles'] as $role_id){
if ( aclGetRefResourcesRoles($rsid,$role_id) )
返回真;
}
dump($user);
}
回傳 false;
}




複製程式碼

程式碼如下:


/**
* 對資源進行acl校驗
*
* @param string $rsid 資源識別
* @param array $user 特定使用者,不指定則校驗目前使用者
*
* @return boolean
*/
function aclVerity($rsid ,array $user = null){
if (empty($rsid)) return false;
if (!CoreApp::$defaultAcl) {
5 :$defaultAcl = new AclFlat();
}
$rsRow = aclGetResource($rsid);
// 未定義資源的缺省存取策略
if (!$rsRow) return false;
CoreAppowLogf ,'test');
/*
* 校驗步驟如下:
*
* 1. 先校驗資源本身access 屬性
* EVERYONE => true,NOBODY => false * 其它的屬性在下面繼續校驗
* 2. 從session(或使用者session表)取得角色id集合
* 3. 如果使用者擁有角色則HAS_ROLE => true , NO_ROLE => false;反之亦然
* 4. 如果資源access == ALLOCATE_ROLES
* 1. 從快取(或$tbRefResourcesRoles)中取得資源對應的角色id集合
* 2. 將使用者擁有的角色id集合與資源對應的角色id集合求交集
* 3. 存在交集=> true;否則=> false
*/
$rsRow['access'] = AclBase::formatAccessValue($rsRow['access']);
// 允許任何人訪問
if (AclBase::EVERYONE == $rsRow['access'] ) return true;
// 不允許任何人存取
if (AclBase::NOBODY == $rsRow['access']) return false;
// 取得使用者資訊
if (empty($user)) $user =$user)) $user = isset($_SESSION['SI-SysUser']) ? $_SESSION['SI-SysUser'] : null;
// 使用者未登入,則當成無存取權
if (empty($user)) return false;
$user['roles'] = empty($user['roles']) ? null : normalize($user['roles'],';');
$userHasRoles = !empty($user['roles'] );
/**
* 允許 不帶有角色的使用者存取
*/
if (AclBase::NO_ROLE == $rsRow['access']) return $userHasRoles ? false : true;
/**
* 允許 帶有角色的使用者存取
*/
if (AclBase: :HAS_ROLE == $rsRow['access']) return $userHasRoles ? true : false;
// --- 對使用者進行資源 角色校驗
if ($userHasRoles){
foreach ($user[' roles'] as $role_id){
if ( aclGetRefResourcesRoles($rsid,$role_id) )
return true;
}
dump($user);
}
return false

function aclRebuildACT($actTable ,$return = false){
if (empty($actTable)) return false;
global $globalConf;
$rst = nacto
global $globalConf;
$rst = $act
global $globalConf;; case CoreApp::$defaultAcl->tbResources:
$cacheId = 'acl-resources';
$rst = SingleTableCRUD::findAll(CoreApp::$defaultAcl->tbResources);
// 轉成哈希表結構
if ($rst){
$rst = array_to_hashmap($rst,'rsid');
}
break;
case CoreApp::$defaultAcl->tbRoles:
$cacheId = 'acl-roingle'; ::findAll(CoreApp::$defaultAcl->tbRoles);
// 轉成雜湊表結構
if ($rst){
$rst = array_to_hashmap($rst,'id');
}
break;
break;
break; case CoreApp::$defaultAcl->tbRefResourcesRoles:
$cacheId = 'acl-roles_has_resources';
$rst = SingleTableCRUD::findAll(CoreApp::$defaultAcl->tbRefResourcesRoles); array();
foreach ($rst as $row) {
$ref_id = "{$row['rsid']}{$row['role_id']}";
$_[$ref_id ] = $row;
}
unset($rst);
$rst = $_;
}
break;
}
if ($cacheId)
writeCache($globalConf['runDir]['cacheId) $cacheId ,$rst ,true);
if ($return) return $rst;
}
/**
* 重新產生 角色資源存取控製表
*
* @param string $actTable ACL表名稱
* @param boolean $return 是否回傳重新產生的清單
*
* @return mixed
*/
function aclGetACT($actTable){
if (empty($actTable)) return false;
static $rst = array();
$cacheId = null;
switch($actTable){
case CoreApp::$defaultAcl->tbResources:
$cacheId = 'acl-resources'; break break; :$defaultAcl->tbRoles:
$cacheId = 'acl-roles';
break;
case CoreApp::$defaultAcl->tbRefResourcesRoles:
$cacheId = 'acl-roles_hasRefResourcesRoles:
$cacheId = 'acl-roles_has__resources'; if $cacheId) return null;
if (isset($rst[$cacheId])) return $rst[$cacheId];
global $globalConf;
// 900
$rst[$cacheId] = getCCache($globald runtime']['cacheDir'],$cacheId,0);
if ( !$rst[$cacheId] ){
$rst[$cacheId] = aclRebuildACT($actTable,true);
}
return $st[ $cacheId];
}
/**
* 取得 角色資源存取控製表 資料
*
* @param string $actTable ACL表名稱
*
* @return mixed
*/
function aclGetResource($rsid){
static $rst = null;
if (!$rst){
$rst = aclGetACT(Core::$ >tbResources);
if (!$rst) $rst = array();
}
return isset($rst[$rsid]) ? $rst[$rsid] : null;
}
/**
* 取得 角色 記錄
*
* @param int $role_id
*
* @return array
*/
function aclGetRole($role_id){
static $rst = null;
if (!$rst){
$rst = aclGetACT(CoreApp::$defaultAcl->tbdefaultAcl->Roles); (!$rst) $rst = array();
}
return isset($rst[$role_id]) ? $rst[$role_id] : null;
}
/**
* 取得 使用者角色關聯 記錄,此方法可以校驗資源是否可被此角色呼叫
*
* @param string $rsid
* @param int $role_id
*
* @return array
*/
function a能力(Ref $rsid,$role_id){
static $rst = null;
if (!$rst){
$rst = aclGetACT(CoreApp::$defaultAcl->tbRefResourcesRoles);
if (!$rst) $st = );
}
$ref_id = "{$rsid}{$role_id}";
CoreApp::writeLog(isset($rst[$ref_id])?$rst[$ref_id]:'nodata' ,$ref_id);
return isset($rst[$ref_id]) ? $rst[$ref_id] : null;
}

http://code.google.com/p/php-excel/downloads/list迷你好用的EXCEL xml 輸出方案
以上就介紹了acrobat professional 9.0 php中實作簡單的ACL 完結篇,包括了acrobat professional 9.0方面的內容,希望對PHP教程有興趣的朋友有所幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板