Php代
/**
* 簡易ACL権限制御機能
*
* テーブル定義
*
※1. リソース定義(rsid、access、desc)
* 2. ロール定義 (id,rolename,desc)
* 3. リソースとロールの関連付け (rsid、role_id)
* 4. ユーザーとロールの関連付け (user_id、role_id)
*
* db.php sqlobject.phpに依存します
*
* @著者 vb2005xu.iteye.com
*/
クラス AclBase {
/**
※誰もアクセスできません
*/
const NOBODY = 0;
/**
*誰でもアクセスを許可します
*/
const 全員 = 1;
/**
* ロールを持つユーザーにアクセスを許可します
*/
const HAS_ROLE = 2;
/**
* 役割のないユーザーにもアクセスを許可します
*/
const NO_ROLE = 3;
/**
* * リソースとロールの関連付けで定義されたロールのみにアクセスできます
*/
const ALLOCATE_ROLES = 4;
// 相対的な表名を決定します
パブリック $tbResources = 'aclresources';
パブリック $tbRoles = 'aclroles';
public $tbRefResourcesRoles = 'aclresources_aclroles';
public $tbRefUsersRoles = 'users_aclroles';
/**
* リソースのアクセス許可をフォーマットして返します
*
* @return int
*/
静的関数 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 文字列 $rsid
* @param int $access
* @param string $desc
*
* @return int
*/
function createResource($rsid,$access,$desc){
if (emptyempty($rsid)) は false を返します。
$resource = array(
'rsid' => $rsid、
'アクセス' => self::formatAccessValue($access)、
'desc' => $desc,
'created_at' => CURRENT_TIMESTAMP
);
return SingleTableCRUD::insert($this->tbResources,$resource);
}
/**
* リソースを変更し、成功ステータスを返します
*
* @param 配列 $resource
* @return int
*/
function updateResource(array $resource){
if (!isset($resource['rsid'])) は false を返します。
$resource['updated_at'] = CURRENT_TIMESTAMP;
return SingleTableCRUD::update($this->tbResources,$resource,'rsid');
}
/**
* リソースを削除します
*
* @param 文字列 $rsid
* @return int
*/
関数 deleteResource($rsid){
if (emptyempty($rsid)) は false を返します。
return SingleTableCRUD::delete($this->tbResources,array('rsid'=>$rsid));
}
/**
*ロールを作成し、ロールレコードの主キーを返します
*
* @param string $rolename
* @param string $desc
*
* @return int
*/
function createRole($rolename,$desc){
if (emptyempty($rolename)) は false を返します。
$role = array(
'ロール名' => $役割名、
'desc' => $desc,
'created_at' => CURRENT_TIMESTAMP
);
return SingleTableCRUD::insert($this->tbRoles,$role);
}
/**
* ロールを変更し、成功ステータスに戻ります
*
* @param 配列 $role
* @return int
*/
function updateRole(array $role){
if (!isset($role['id'])) は 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
*/
関数 deleteRole($role_id){
if (emptyempty($role_id)) は false を返します。
return SingleTableCRUD::delete($this->tbRoles,array('role_id'=>(int) $role_id));
}
/**
* リソースのロールを指定し、毎回挿入する前に関連するレコードをすべてテーブルから削除します
*
* @param int $rsid
* @param 混合 $roleIds
* @param boolean $setNull ロールIDが存在しない場合に関連付けテーブルからリソースをクリアするかどうか
*/
function assignRolesForResource($rsid,$roleIds,$setNull=false,$defaultAccess=-1){
if (emptyempty($rsid)) は false を返します。
$roleIds = Normalize($roleIds,',');
if (emptyempty($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 ($role_id としての $roleIds){
SingleTableCRUD::insert($this->tbRefResourcesRoles,array('rsid'=>$rsid,'role_id'=>(int)$role_id));
}
true を返します。
}
関数 cleanRolesForResource($rsid){
if (emptyempty($rsid)) は false を返します。
return SingleTableCRUD::delete($this->tbRefResourcesRoles,array('rsid'=>$rsid));
}
関数 cleanResourcesForRole($role_id){
if (emptyempty($role_id)) は false を返します。
return SingleTableCRUD::delete($this->tbRefResourcesRoles,array('role_id'=>(int) $role_id));
}
/**
* リソースをロールに割り当てるとき、テーブル内のすべての関連レコードが削除され、毎回挿入されます
*
* @param int $role_id
* @param 混合 $rsids
*
* @return boolean
*/
関数 assignResourcesForRole($role_id,$rsids){
if (emptyempty($role_id)) は false を返します。
$role_id = (int) $role_id;
$rsids = 正規化($rsids,',');
if (emptyempty($rsids)){
false を返します。
}
SingleTableCRUD::delete($this->tbRefResourcesRoles,array('role_id'=>$role_id));
$rsids = array_unique($rsids);
foreach ($rsid として $rsid){
SingleTableCRUD::insert($this->tbRefResourcesRoles,array('rsid'=>$rsid,'role_id'=>$role_id));
}
true を返します。
}
/**
* ユーザーに役割を割り当て、毎回挿入する前に関連するレコードをすべてテーブルから削除します
*
* * ユーザーが多いとパフォーマンスの問題が発生する可能性があります...最適化する方法は後で考えます
*
* @param int $user_id
* @param 混合 $roleIds
*
* @return boolean
*/
関数 assignRolesForUser($user_id,$roleIds){
if (emptyempty($user_id)) は false を返します。
$user_id = (int) $user_id;
$rsids = 正規化($rsids,',');
if (emptyempty($rsids)){
false を返します。
}
SingleTableCRUD::delete($this->tbRefUsersRoles,array('user_id'=>$user_id));
$roleIds = array_unique($roleIds);
foreach ($roleId としての $roleId){
SingleTableCRUD::insert($this->tbRefUsersRoles,array('user_id'=>$user_id,'role_id'=>$role_id));
}
true を返します。
}
関数 cleanRolesForUser($user_id){
if (emptyempty($user_id)) は false を返します。
return SingleTableCRUD::delete($this->tbRefUsersRoles,array('user_id'=>(int) $user_id));
}
関数 cleanUsersForRole($role_id){
if (emptyempty($role_id)) は 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){
if (emptyempty($rsid)) は false を返します。
}
Java代
/*
* 校验步骤如下:
*
* 1. 先校验 资源本身アクセス属性
* 全員 => true,NOBODY => false * 他のプロパティは下にあります
* 2.セッション(または用户セッション表)中获取角色id集合
* 3. ユーザーがロールを持っている場合、HAS_ROLE => true、NO_ROLE => false になります。
* 4. リソースアクセス == ALLOCATE_ROLESの場合
* 1. リソースに対応するロールIDセットをキャッシュ(または$tbRefResourcesRoles)から取得します* 2. ユーザーが所有するロール ID セットとリソースに対応するロール ID セットの共通点を見つけます
* * 3. 交差が存在する=> それ以外の場合=>
*/
気を失うまでに30分かかりました。明日時間を見つけて完璧に仕上げます。
http://www.bkjia.com/PHPjc/478723.html