Heim  >  Artikel  >  Backend-Entwicklung  >  Implementieren Sie eine einfache ACL in PHP

Implementieren Sie eine einfache ACL in PHP

高洛峰
高洛峰Original
2016-11-30 14:04:041185Durchsuche

代码如下: 
-- ACL Tables 
-- 表的结构 `aclresources` 
DROP TABLE IF EXISTS `aclresources`; 
TABELLE ERSTELLEN, WENN NICHT EXISTIERT `aclresources` ( 
`rsid` varchar(64) NOT NULL , 
`access` int(4) NOT NULL Standard 0, 
`desc` varchar(240) NOT NULL Standard '', 
`created_at` int(10) unsigned NOT NULL Standard 1, 
`updated_at` int(10) unsigned NOT NULL Standard 0, 
PRIMARY KEY (`rsid`) 
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
-- 表的结构 `aclroles` 
DROP TABLE IF EXISTS `aclroles`; 
TABELLE ERSTELLEN, WENN NICHT EXISTIERT `aclroles` ( 
`id` int(10) unsigned NOT NULL auto_increment, 
`rolename` varchar(32) NOT NULL , 
`desc` varchar(240) NOT NULL Standard '', 
`created_at` int(10) unsigned NOT NULL Standard 1, 
`updated_at` int(10) unsigned NOT NULL Standard 0, 
PRIMARY KEY (`id`), 
EINZIGARTIGER SCHLÜSSEL `rolename` (`rolename`) 
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
-- 表的的结构 `ref_aclresources_aclroles` 
DROP TABLE IF EXISTS `ref_aclresources_aclroles`; 
TABELLE ERSTELLEN, WENN NICHT EXISTIERT `ref_aclresources_aclroles` ( 
`rsid` varchar(64) NOT NULL , 
`role_id` int(10) unsigned NOT NULL , 
PRIMÄRSCHLÜSSEL (`rsid`,` role_id`) 
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
-- 表的的结构 `ref_users_aclroles` 
DROP TABLE IF EXISTS `ref_users_aclroles`; 
TABELLE ERSTELLEN, WENN NICHT EXISTIERT `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,
`nickname` varchar(32) NOT NULL default '', 
`roles` varchar(240) NOT NULL default '', 
`created_at` int(10) unsigned NOT NULL default 1, 
`updated_at` int(10) unsigned NOT NULL default 0, 
PRIMARY KEY (`id`), 
UNIQUE KEY `user_email` (`email`) 
)DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

php 类 
 代码如下: 
/**
* Einfache ACL-Berechtigungskontrollfunktion
*
* Tabellendefinition
*
* 1. Ressourcendefinition (RSID, Zugriff, Desc, erstellt_at, aktualisiert_at)
* 2. Rollendefinition (ID, Rollenname, Desc, erstellt_at, aktualisiert_at)
* 3. Ressourcen-Rollen-Zuordnung (rsid, Rollen_ID)
* 4. Benutzer-Rollen-Zuordnung (Benutzer-ID, Rollen_ID)
*
* Hängt davon ab auf db.php sqlobject.php
*
* @author vb2005xu.iteye.com
*/ 
class AclBase { 
// --- ACL 访问授权 

/**
* Niemand darf auf
zugreifen*/ 
const NOBODY = 0; 

/**
* Erlauben Sie jedem den Zugriff auf
*/ 
const EVERYONE = 1; 

/**
* Erlauben Sie Benutzern mit Rollen den Zugriff auf
*/ 
const HAS_ROLE = 2; 

/**
* Erlauben Sie Benutzern ohne Rollen den Zugriff auf
*/ 
const NO_ROLE = 3; 
/**
* Nur Rollen, die in der Ressourcen-Rollen-Zuordnung definiert sind, können auf
zugreifen*/ 
const ALLOCATE_ROLES = 4; 

// 定义相关的 表名 
public $tbResources = 'aclresources'; 
public $tbRoles = 'aclroles'; 
public $tbRefResourcesRoles = 'ref_aclresources_aclroles'; 
public $tbRefUsersRoles = 'ref_users_aclroles'; 

/**
* Ressourcenzugriffsrechte formatieren und zurückgeben
*
* @return int
*/ 
statische Funktion formatAccessValue($access){ 
statische $arr = array(self::NOBODY,self::EVERYONE,self::HAS_ROLE,self ::NO_ROLE,self::ALLOCATE_ROLES); 
return in_array($access,$arr) ? $access : self::NOBODY; 


/**
* Erstellen Sie eine Ressource und geben Sie den Primärschlüssel des Ressourcendatensatzes zurück
*
* @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'); 


/**
* Ressource löschen
*
* @param string $rsid
* @return int
*/ 
function deleteResource($rsid){ 
if (empty($rsid)) return false; 
return SingleTableCRUD::delete($this->tbResources,array('rsid'=>$rsid)); 


/**
* Erstellen Sie eine Rolle und geben Sie den Primärschlüssel des Rollendatensatzes zurück
*
* @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); 


/**
* Ändern Sie die Rolle und geben Sie den Erfolgsstatus zurück
*
* @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'); 


/**
* Rolle löschen
*
* @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)); 


/**
* Geben Sie Rollen für Ressourcen an und entfernen Sie jedes Mal alle relevanten Datensätze in der Tabelle, bevor Sie sie einfügen
*
* @param int $rsid
* @param Mixed $roleIds
* @param boolean $setNull Wenn die Rollen-ID nicht vorhanden ist, ob die Ressource aus der Zuordnungstabelle
gelöscht werden soll*/ 
function allocateRolesForResource($rsid,$roleIds,$setNull=false,$defaultAccess=-1){ 
if (empty($ rsid)) return 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 zurückgeben; 

false zurückgeben; 


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 zurückgeben; 


Funktion 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)); 


/**
* Ressourcen zu Rollen zuweisen, jedes Mal alle relevanten Datensätze in der Tabelle entfernen und sie dann einfügen
*
* @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 = 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 zurückgeben; 


/** 
* 为用户指派角色,每次均先全部移除表中相关记录再插入 

* Hier kann es zu Leistungsproblemen kommen, wenn es viele Benutzer gibt... Wir werden später darüber nachdenken, wie wir es optimieren können
*
* @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 = normalize($roleIds,',');
if (empty($roleIds)){
return false; :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));
}
return true;
}

/**
* Rolleninformationen des Benutzers löschen
*
* @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));
}

/**
* Benutzerzuordnung der Rolle löschen
*
* @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)); >}

}

Der spezifische Erkennungscode lautet wie folgt:
Code kopieren Der Code lautet wie folgt:
/**
* ACL-Überprüfung für Ressourcen durchführen
*
* @param string $rsid-Ressourcen-ID
* @param array $user spezifischer Benutzer, falls nicht angegeben, überprüfen Sie den aktuellen Benutzer
*
* @return boolean
*/
Funktion aclVerity ($rsid ,array $user = null){

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

$rsRow = aclGetResource($rsid);

// Standardzugriffsrichtlinie für undefinierte Ressourcen
if (!$rsRow) return false;

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

$rsRow['access'] = AclBase::formatAccessValue($rsRow['access']);
// Zulassen, dass jeder zugreifen kann
if (AclBase::EVERYONE == $rsRow['access']) return true;

// Niemand darf darauf zugreifen
if ( AclBase::NOBODY == $ rsRow['access']) return false;

// Benutzerinformationen abrufen
if (empty($user)) $user = isset($_SESSION['SI- SysUser']) ? $_SESSION ['SI-SysUser'] : null; )) return false;

$user[ 'roles'] = empty($user['roles']) ? null : normalize($user['roles'],';');
$userHasRoles = !empty($user['roles ']);

/**
* Erlauben Sie Benutzern ohne Rollen den Zugriff auf
*/
if (AclBase::NO_ROLE == $rsRow['access'] ) return $userHasRoles : true;**
* Erlauben Sie Benutzern mit Rollen den Zugriff auf
*/
if (AclBase::HAS_ROLE == $rsRow['access']) return $userHasRoles : false;

// --- Operationen an den Benutzerressourcen<-> durchführen. Rollenüberprüfung
if ($userHasRoles){
foreach ($user['roles'] as $role_id){
if ( aclGetResourcesRoles($rsid,$role_id) )
return true;
}
dump($user);
}
return false; 🎜>Code kopieren Der Code lautet wie folgt:
/**
* ACL-Überprüfung für Ressourcen durchführen
*
* @param string $rsid-Ressourcen-ID
* @param array $user spezifischer Benutzer, falls nicht angegeben, überprüfen Sie den aktuellen Benutzer
*
* @return boolean
*/
function aclVerity($rsid ,array $user = null){

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

$rsRow = aclGetResource($rsid);

// Standardzugriffsrichtlinie für undefinierte Ressourcen
if (!$rsRow) return false

CoreApp::writeLog($rsRow,'test'); >/*
* Die Überprüfungsschritte sind wie folgt:
*
* 1. Überprüfen Sie zuerst das Zugriffsattribut der Ressource selbst
* EVERYONE => true, NOBODY => false * Weiter zu Überprüfen Sie die anderen Attribute unten
* 2. Aus der Sitzung (oder Benutzersitzung. Holen Sie sich die Rollen-ID aus der Tabelle)
* 3. Wenn der Benutzer eine Rolle hat, HAS_ROLE => true, NO_ROLE => false und umgekehrt
* 4. Wenn der Ressourcenzugriff == ALLOCATE_ROLES
* 1. Erhalten Sie den Rollen-ID-Satz, der der Ressource entspricht, aus dem Cache (oder $tbRefResourcesRoles)
* 2. Finden Sie die Schnittmenge des Rollen-ID-Satzes, der dem Benutzer gehört, und des Rollen-ID-Satzes, der der Ressource entspricht
* 3. Schnittmenge vorhanden => ; sonst=> >
// Zulassen, dass jeder darauf zugreifen kann
if (AclBase::EVERYONE == $rsRow['access']) return true;

// Niemand darf auf
zugreifen, wenn (AclBase::NOBODY == $ rsRow['access']) return false;

// Benutzerinformationen abrufen
if (empty($user)) $user = isset($_SESSION['SI -SysUser']) ? $_SESSION ['SI-SysUser'] : null; user)) return false;

$user[ 'roles'] = empty($user['roles']) ? null : normalize($user['roles'],';'); >
$userHasRoles = !empty($user['roles ']);

/**
* Erlauben Sie Benutzern ohne Rollen den Zugriff auf
*/
if (AclBase::NO_ROLE == $rsRow['access' ]) return $userHasRoles : true; **
* Erlauben Sie Benutzern mit Rollen den Zugriff auf
*/
if (AclBase::HAS_ROLE == $rsRow['access']) return $userHasRoles : true ;

// --- Operationen an den Benutzerressourcen<-> durchführen
if ($userHasRoles){
foreach ($user['roles'] as $role_id){
if ( aclGetRefResourcesRoles($rsid,$role_id) )
return true;
}
dump($user);
}
return false; {
if (empty($actTable)) return false;

global $globalConf;
$cacheId = null; actTable){
case CoreApp::$defaultAcl->tbResources:
$cacheId = 'acl-resources';
$rst = SingleTableCRUD::findAll(CoreApp:: $defaultAcl->tbResources) ;
// In Hash-Tabellenstruktur konvertieren
$rst = array_to_hashmap($rst,'rsid');
break; ::$defaultAcl->tbRoles:
$cacheId = 'acl-roles';
$rst = SingleTableCRUD::findAll(CoreApp::$defaultAcl->tbRoles) ; Hash-Tabellenstruktur
if ($rst){
$rst = array_to_hashmap($rst,'id');
}
break;
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']['cacheDir'] ,$cacheId ,$rst ,true);

if ($return) return $rst ;
}
/**
* Rollenressourcen-Zugriffskontrollliste neu generieren
*
* @param string $actTable ACL-Tabellenname
* @param boolean $return Ob die neu generierte Liste zurückgegeben werden soll
*
* @ gemischt zurückkommen
*/
function aclGetACT($actTable){
if (empty($actTable)) return false;

static $rst = array();

$cacheId = null;

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';
break;

}

if (!$cacheId) return null ; isset($rst[$cacheId])) return $rst[$cacheId];

global $globalConf
// 900
$rst[$cacheId] = getCache($globalConf[' runtime']['cacheDir'],$cacheId,0);
if ( !$rst[$cacheId] ){
$rst[$cacheId] = aclRebuildACT(
}

return $rst[$cacheId];
/**
* Rollenressourcen-Zugriffskontrolllistendaten abrufen
*
* @param string $actTable ACL-Tabellenname
*
* @return gemischt
*/
function aclGetResource($rsid){
static $rst = null 🎜>if (!$rst){
$rst = aclGetACT(CoreApp::$defaultAcl->tbResources); 
if (!$rst) $rst = array(); 

isset($rst[$rsid]) zurückgeben? $rst[$rsid] : null; 

/**
* Rollendatensatz abrufen
*
* @param int $role_id
*
* @return array
*/ 
function aclGetRole($role_id){ 
static $rst = null; 
if (!$rst){ 
$rst = aclGetACT(CoreApp::$defaultAcl->tbRoles); 
if (!$rst) $rst = array(); 

isset($rst[$role_id]) zurückgeben? $rst[$role_id] : null; 

/**
* Ruft den Benutzerrollenzuordnungsdatensatz ab.
*
* @param string $rsid
* @param int $role_id
*
* @return array
*/ 
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); 
isset($rst[$ref_id]) zurückgeben? $rst[$ref_id] : null; 


http://code.google.com/p/php-excel/downloads/list 迷你好用的 EXCEL xml 输出方案 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn