小黑米的生活

只玩技术

权限设计

leave a comment

权限设计使用的是按位与或、取反等运算完成~ 如果你懂二进制,那么这一切都将很简单~

下面代码使用了接口进行定义封装,主要是这样处理起来更加优雅~ 更方便日后进行代码移植

<?php
/**
 * 用户接口
 * @author edwardhey
 *
 */

interface Acl_User{
    /**
     * 获取访问 $res 资源的权限,如果用户有多个权限组都有对 $res 的访问权限,将会对权限进行合并,然后输出
     * @param Acl_Resource $res

     * @return int
     */

    public function getAccess(Acl_Resource $res);
   
    /**
     * 设置对 $res 的访问权限
     * @param Acl_Resource $res
     * @param int $access
     * @return int
     */

    public function setAccess(Acl_Resource $res,$access);
}

/**
 *
 * 资源接口
 * @author edwardhey
 *
 */

interface Acl_Resource{
    public function getName();
}

class Resource implements Acl_Resource{
    public function checkValid(Acl_User $role,$access){
        $access = (int)$access&0xffff;//防止非法权限值
       
        if(!$access) return false;
       
        $bindAccess = $role->getAccess($this);
        return ($bindAccess&$access)==$access;
       
    }
   
    public function getName(){
        return 'test';
    }
}

class User implements Acl_User{
   
    protected $access = array();
   
    public function getAccess(Acl_Resource $res){
        $name = $res->getName();
        if(!isset($this->access[$name])){
            return 0;
        }else{
            return $this->access[$name];
        }
    }
   
    public function setAccess(Acl_Resource $res,$access){
        $name = $res->getName();
        if(!isset($this->access[$name])){
            $bindAccess = 0;
        }else{
            $bindAccess = $this->access[$name];
        }
       
        $access = (int)$access&0xffff;//防止非法权限值
        $bindAccess |= $access;
        $this->access[$name] = $bindAccess;
    }
}

$res = new Resource();

$user = new User();
$user->setAccess($res, 0xffff);

var_dump($res->checkValid($user, 88));

原创文章,转载请注明: 转载自小黑米的生活

本文链接地址: 权限设计

Written by edwardhey

四月 28th, 2011 at 8:39 上午

Posted in php,技术

Leave a Reply

无觅相关文章插件,快速提升流量