Heim > Artikel > Backend-Entwicklung > Implementieren Sie eine einfache ACL in PHP
代码如下:
-- 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 输出方案