Skip to content

Latest commit

 

History

History
79 lines (65 loc) · 3.9 KB

README.ja.md

File metadata and controls

79 lines (65 loc) · 3.9 KB

BEAR.AclResource

Scrutinizer Code Quality Code Coverage Build Status

An ACL embedded resources module for BEAR.Sunday

このモジュールは指定したpageリソースにACLに応じたappリソースを埋め込みます。 @Embeddedアノテーションがappリソースをハードコードして埋め込むのに対して、このモジュールではACLと設定に基づいてリソースを埋め込みます。 ソースコードに変更を加えることなくpageのリソースツリーを変更することができます。

Install

Composer install

$ composer require bearsunday/acl-resource 1.x-dev

Module install

use Ray\Di\AbstractModule;
use Ray\TestDouble\TestDoubleModule;
use Ray\RoleModule\RoleProviderInterface;

class DevRoleProvider implements RoleProviderInterface
{
    // provide role
    public function get()
    {
        return 'guest';
    }
}

class AppModule extends AbstractModule
{
    protected function configure()
    {
        // configure ACL
        $acl = new Acl();
        $roleGuest = new Role('guest');
        $acl->addRole($roleGuest);
        $acl->addRole(new Role('owner'), $roleGuest);
        $acl->addResource(new Resource('app://self/entries'));
        $acl->addResource(new Resource('app://self/users'));
        $acl->addResource(new Resource('app://self/comments'));
        $acl->allow('guest', ['app://self/entries', 'app://self/comments']);
        $acl->allow('admin', 'app://self/friends');
        // configure embedded resource list
        $resources = [
            'page://self//blog' => [
                 'app://self/entries',
                 'app://self/comments',
                 'app://self/friends'
             ],
            'page://self//admin/setting' => [
                'app://self/user{?id}',
                'app://self/freinds?user_id={id}'
            ]
        ];
        // define provider
        $roleProviderClass = DevRoleProvider::class;
        // install module        
        $this->install(new AclResourceModule($acl, $resources, $roleProviderClass));
    }
}
  • $aclにはZend\Permaissions\AclのACL(access control list)を指定します。 $aclに利用可能なappリソースのURのpathを全てaddResourceし、ロールに対してアクセス可能/不可能なappリソースをallow()/disallow()メソッドで指定します。
  • $resourcesはそれぞれのpageリソースがどのappリソースをembeddedできるかのリストです。
  • $roleProviderClassには現在のユーザーのロールを(ログイン状態などから)返すクラス名を指定します。RoleProviderInterfaceを実装する必要があります。

上記に例ではguest権限で/blogページをアクセスするとapp://self/entriesapp://self/commentsリクエストがそれぞれ$body['entries]$body['comments]にセットされます。

appリソースにクエリー(引数)を指定するには下記の2つの方法があります。

  • URIパスの指定にuri templateを使う方法。ageリソースに渡されたクエリーをappリソースのクエリーに使います。例)user{?id}, freinds?user_id={id}
  • 埋め込んだリソースリクエストにaddQuery()withQuery()を使ってリクエストを変更します。 例) $this->body['admin/setting']->addQuery(['extra_param' => 1]);