ホームページ  >  記事  >  バックエンド開発  >  簡単な ACL_PHP チュートリアルを実装する

簡単な ACL_PHP チュートリアルを実装する

WBOY
WBOYオリジナル
2016-07-13 17:44:48894ブラウズ

 

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

www.bkjia.com本当http://www.bkjia.com/PHPjc/478723.html技術記事 Php code?php /** * 簡易ACL権限制御関数 * * テーブル定義 * * 1. リソース定義 (rsid、access、desc) * 2. ロール定義 (id、rolename、desc) * 3. リソースとロールの関連付け ( rsid、role_id...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。