}
}
具体 检测的代码 如下:
/**
* 对资源进行acl校验
*
* @param string $rsid 资源标识
* @param array $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 : 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;
}
/**
* 对资源进行acl校验
*
* @param string $rsid 资源标识
* @param array $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. 先校验 资源本身 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;







