ホームページ > php教程 > php手册 > PHP での単純な ACL の実装 - 最終記事

PHP での単純な ACL の実装 - 最終記事

WBOY
リリース: 2016-06-13 12:05:35
オリジナル
1162 人が閲覧しました

复制代 代码如下:


-- ACL テーブル
-- 表の構造 `aclresources`
DROP TABLE IF `aclresources` が存在します。
CREATE TABLE IF NOT EXISTS `aclresources` (
`rsid` varchar(64) NOT NULL 、
`access` int(4) NOT NULL デフォルト 0、
`desc` varchar(240) NOT NULL デフォルト ''、
`created_at` int(10) 符号なし NOT NULL デフォルト 1、
`updated_at` int(10) 符号なし NOT NULL デフォルト 0、
PRIMARY KEY (`rsid`)
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- テーブルの構造 `aclroles`
DROP TABLE IF EXISTS `aclroles`;
CREATE TABLE IF NOT EXISTS `aclroles` (
`id` int(10) unsigned NOT NULL auto_increment,
`rolename` varchar(32) NOT NULL ,
`desc` varchar(240) NOT NULL デフォルト ''、
`created_at` int(10) 符号なし NOT NULL デフォルト 1、
`updated_at` int(10) 符号なし NOT NULL デフォルト 0、
PRIMARY KEY (`id`)、
一意のキー `rolename` (`rolename`)
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- テーブルの構造 `ref_aclresources_aclroles`
DROP TABLE IF EXISTS `ref_aclresources_aclroles`;
CREATE TABLE IF NOT EXISTS `ref_aclresources_aclroles` (
`rsid` varchar(64) NOT NULL ,
`role_id` int(10) unsigned NOT NULL ,
PRIMARY KEY (`rsid`,` role_id`)
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- テーブルの構造 `ref_users_aclroles`
存在する場合はテーブルを削除 `ref_users_aclroles`;
CREATE TABLE IF NOT EXISTS `ref_users_aclroles` (
`user_id` int(10) unsigned NOT NULL auto_increment,
`role_id` int(10) unsigned NOT NULL ,
PRIMARY KEY (`user_id` ,`role_id`)
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- テーブルの構造 `users`
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL,
`password` varchar(64) NOT NULL,
`ニックネーム` 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、
主キー (`id`)、
一意のキー `user_email` (`email`)
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


php 类

复制代码代码如下:


/**
* 簡易 ACL 権限制御関数
*
* テーブル定義
*
* 1. リソース定義 (rsid、access、desc、created_at、updated_at)
* 2. ロール定義(id, rolename, desc, created_at, updated_at)
* 3. リソースとロールの関連付け (rsid, role_id)
* 4. ユーザーとロールの関連付け (user_id, role_id)
*
* 依存db.php sqlobject.php
*
* @author vb2005xu.iteye.com
*/
class AclBase {
// --- ACL 访问授权

/**
* 誰も
にアクセスできません */
const NOBODY = 0;

/**
* 誰でも
へのアクセスを許可します*/
const EVERYONE = 1;

/**
* ロールを持つユーザーに
へのアクセスを許可します*/
const HAS_ROLE = 2;

/**
* ロールのないユーザーに
へのアクセスを許可します*/
const NO_ROLE = 3;
/**
* リソースとロールの関連付けで定義されたロールのみが
にアクセスできます*/
const ALLOCATE_ROLES = 4;

// 相対的なテーブル名を決定します
public $tbResources = 'aclresources';
パブリック $tbRoles = 'aclroles';
public $tbRefResourcesRoles = 'ref_aclresources_aclroles';
public $tbRefUsersRoles = 'ref_users_aclroles';

/**
* リソースのアクセス許可をフォーマットして返します
*
* @return int
*/
static function formatAccessValue($access){
static $arr = array(self::NOBODY,self::EVERYONE,self::HAS_ROLE,self ::NO_ROLE,self::ALLOCATE_ROLES);
return in_array($access,$arr) ? $access : self::NOBODY;
}

/**
* リソースを作成し、リソース レコードの主キーを返します
*
* @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_TIMESTAMP
);

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
*/
function deleteResource($rsid){
if (empty($rsid)) return false;
return SingleTableCRUD::delete($this->tbResources,array('rsid'=>$rsid));
}

/**
* ロールを作成し、ロール レコードの主キーを返します
*
* @param string $rolename
* @param string $desc
*
* @return int
*/
function createRole($rolename,$desc){
if (empty($rolename)) return false;

$role = array(
'rolename' => $rolename,
'desc' => $desc,
'created_at' => CURRENT_TIMESTAMP
);

return SingleTableCRUD::insert($this->tbRoles,$role);
}

/**
* ロールを変更し、成功ステータスを返します
*
* @param array $role
* @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 int $role_id
* @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 $rsid
* @parammixed $roleIds
* @param boolean $setNull ロールIDが存在しない場合、アソシエーションテーブルからリソースをクリアするかどうか
*/
function assignRolesForResource($rsid,$roleIds,$setNull=false,$defaultAccess=-1){
if (empty($ rsid)) false を返します。

$roleIds = Normalize($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
* @parammixed $rsids
*
* @return boolean
*/
function assignResourcesForRole($role_id,$rsids){
if (empty($role_id)) return false;

$role_id = (int) $role_id;
$rsids = Normalize($rsids,',');
if (empty($rsids)){
return 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
* @parammixed $roleIds
*
* @return boolean
*/
function assignRolesForUser($user_id,$roleIds){
if (empty($user_id)) return false;

$user_id = (int) $user_id;
$roleIds = Normalize($roleIds,',');
if (empty($roleIds)){
return 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 resource identifier
* @param array $user specific user (指定されていない場合は、現在のユーザーを検証します)
*
* @return boolean
*/
function aclVerity($rsid ,array $user = null){

if (empty($rsid)) return false;
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'] = empty($user['roles']) ? null : 正規化($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;
}
ダンプ($user);
}
false を返します。
}


复制代代码如下:


/**
* リソースの ACL 検証を実行します
*
* @param string $rsid resource identifier
* @param array $user specific user (指定されていない場合は、現在のユーザーを検証します)
*
* @return boolean
*/
function aclVerity($rsid ,array $user = null){

if (empty($rsid)) return false; if (!CoreApp::$defaultAcl) {
CoreApp::$defaultAcl = new AclFlat();

$rsRow = aclGetResource($rsid); / 未定義のリソースのデフォルトのアクセス ポリシー
if (!$rsRow) return false;

CoreApp::writeLog($rsRow,'test');

/*
*検証手順は次のとおりです。
*
* 1. まず、リソース自体のアクセス属性を検証します
* EVERYONE => true、NOBODY => false * 以下の他の属性の検証を続けます
* 2. セッション (またはユーザー セッション テーブル) から設定されたロール ID を取得します
* 3. ユーザーがロールを持っている場合、HAS_ROLE => true、NO_ROLE => false の逆になります
* 4. リソースの場合access == ALLOCATE_ROLES
* 1. リソースに対応するロール ID セットをキャッシュ (または $tbRefResourcesRoles) から取得します
* 2. ユーザーが所有するロール ID セットとロール ID セットの共通部分を見つけますリソースに対応します
* 3. 交差が存在する=> それ以外の場合=> false
*/

$rsRow['access'] = AclBase::formatAccessValue(' 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'] = empty($user['roles']) null :normalize($user['roles'], ';');

$userHasRoles = !empty($user['roles']);

/**
* ロールのないユーザーに
へのアクセスを許可します*/
if (AclBase::NO_ROLE = = $rsRow['access']) $userHasRoles を返す ? false :

/**
* 役割を持つユーザーに
へのアクセスを許可します*/
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;
}
return false; >}
/**
* ロールリソースのアクセス制御リストを再生成します
*
* @param string $actTable ACL テーブル名
* @param boolean $return 再生成されたリストを返すかどうか
*
* @return 混合
* /
function aclRebuildACT($actTable ,$return = false){
if (empty($actTable)) return false;

global $ globalConf;
$rst = null;
$cacheId = null;

switch($actTable){
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-roles'; >$rst = SingleTableCRUD::findAll(CoreApp: :$defaultAcl->tbRoles);
//ハッシュ テーブル構造に変換します
if ($rst){
$rst = array_to_hashmap($rst, 'id');
}
case CoreApp::$defaultAcl->tbRefResourcesRoles:
$cacheId = 'acl-roles_has_resources';
$rst = SingleTableCRUD::findAll (CoreApp::$defaultAcl->tbRefResourcesRoles );
if ($rst){
$_ = array();
foreach ($rst as $row) {
$ref_id = " {$row['rsid']}< ;-|->{$row['role_id']}";
$_[$ref_id] = $row;
}
unset($ rst);
$rst = $ _;
}
break
}

if ($cacheId)
writeCache($globalConf['runtime']['
/**
* ロールリソースのアクセス制御リストデータの取得
*
* @param string $actTable ACL テーブル名
*
* @returnmixed
*/
関数 aclGetACT($ actTable){
if (empty( $actTable)) return false;

static $rst = array();

switch( $actTable){
case CoreApp::$defaultAcl->tbResources:
$cacheId = 'acl-resources';
break;
case CoreApp::$defaultAcl->tbRoles:
$cacheId = 'acl-roles' ;
case CoreApp::$defaultAcl->tbRefResourcesRoles:
$cacheId = 'acl-roles_has_resources';
}

if (!$cacheId) return null;

if (isset($rst[$cacheId])) return $rst[$cacheId]; >global $globalConf;
// 900
$rst[$cacheId] = getCache($globalConf['runtime']['cacheDir'],$cacheId,0); [$cacheId] ){
$ rst[$cacheId] = aclRebuildACT($actTable,true)
}

return $rst[$cacheId]
}
/**
* リソース レコードの取得
*
* @param string $rsid
*
* @return array
*/
function aclGetResource($rsid){
static $rst = null;
if (!$rst){
$rst = aclGetACT(CoreApp::$defaultAcl->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->tbRoles);
if (!$rst) $rst = array();
}
return isset($rst[$role_id]) ? $rst[$role_id] : null;
}
/**
* ユーザー ロールの関連付けレコードを取得します。このメソッドは、このロールによってリソースを呼び出すことができるかどうかを確認できます。 *
* @return 配列
*/
function aclGetRefResourcesRoles($rsid,$role_id){
static $rst = null;
if (!$rst){
$rst = aclGetACT(CoreApp::$defaultAcl->tbRefResourcesRoles);
if (!$rst) $rst = array();
}
$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 出方案

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート