Инструменты пользователя

Инструменты сайта


limb3:ru:packages:acl

Пакет ACL

Пакет ACL - класс, реализующий функционал ACL и инфраструктура для его использования.

:!: Пакет находится на стадии разработки, что может привести к небольшим изменениям в API.

Доступ к объекту ACL

ACL представляет из себя «звездный» объект, и доступ к нему можно получить через toolkit

  $acl_object = lmbToolkit::instance()->getAcl();
  lmbToolkit::instance()->setAcl($acl_object);

Конфигурация ACL

В данный момент конфигурирование ACL возможно только через API. Удобнее всего оформить код конфигурации в виде фильтра для контроллера приложения.

Создание ролей

 $acl->addRole('guest'); //регистрируем роль guest
 $acl->addRole('member', 'guest'); //регистрируем роль member, которая будет наследовать правила роли guest
 
 $acl->addRole('moderator');
 $acl->addRole('admin', array('moderator', 'member')); //множественное наследование ролей

Создание ресурсов

$acl->addResource('content'); //создание ресурса
$acl->addResource('article', 'content'); //создание с наследованием
 
$acl->addResource('front_content', 'content');
$acl->addResource('front_article', array('front_content', 'article')); //множественное наследование

Назначение правил

Назначение правила для привилегии

$acl->addRole('guest');
$acl->addResource('news');
$acl->allow('guest', 'news', 'view');
 
var_dump($acl->isAllowed('guest', 'news', 'view')); //true
var_dump($acl->isAllowed('guest', 'news', 'edit')); //false
 
$acl->allow('guest', 'news', array('view', 'comment');
var_dump($acl->isAllowed('guest', 'news', 'view')); //true
var_dump($acl->isAllowed('guest', 'news', 'comment')); //true

Назначение правила целиком на весь ресурс

$acl->addRole('moderator');
$acl->addResource('news');
$acl->allow('moderator', 'news');
 
var_dump($acl->isAllowed('moderator', 'news')); //true
var_dump($acl->isAllowed('moderator', 'news', 'edit')); //true

Назначение правила на все ресурсы

$acl->addRole('admin');
$acl->allow('admin');
 
$acl->addResource('news');
 
var_dump($acl->isAllowed('admin', 'news')); //true
var_dump($acl->isAllowed('admin', 'news', 'edit')); //true

Использование ACL

Использование ACL по сути сводится к одному методу - lmbAcl::isAllowed(), но в зависимости от переданных данных процесс определения ролей и ресурсов идет по разному.

Явное указание ролей и ресурсов

$acl->isAllowed('marketing', 'content', 'view')); //имеет ли роль "marketing" привилегию "view", над ресурсом "content"

Объекты, как носители роли или ресурса

Методу isAllowed в качестве роли можно передавать объект. Этот объект должен реализовывать интерфейс lmbRoleProviderInterface.

class User implements lmbRoleProviderInterface
{
  ...
  function getRole()
  {
    if($this->is_logged_in)
      return 'member';
    else
      return 'guest';
  }
}
 
class News implements lmbResourceProviderInterface
{
  ...
  function getResource()
  {
    return 'news';
  }
}
 
$acl->addRole('guest');
$acl->addRole('user', 'guest');
$acl->addResource('news');
$acl->allow('guest', 'news', 'comment');
$acl->allow('user', 'news', 'vote');
 
$user = new User;
$news = new News;
 
var_dump($acl->isAllowed($user, $news, 'comment'); //true
var_dump($acl->isAllowed($user, $news, 'vote'); //false
 
$user->setIsLoggedIn(true);
 
var_dump($acl->isAllowed($user, $news, 'comment'); //true
var_dump($acl->isAllowed($user, $news, 'vote'); //true

Определение роли объекта в контексте объекта-ресурса

Очень часто объекты-роли, и объекты-ресурсы имеют внутренние связи друг с другом. Например пользователь может быть автором новости, или модератором конкретного раздела сайта. Для разрешения роли конкретного объекта-роли, в контексте определенного объекта-ресурса, объект-ресурс должен реализовывать интерфейс lmbRolesResolverInterface (метод getRoleFor()):

class Article implements lmbRolesResolverInterface, lmbResourceProviderInterface
{  
  function getRoleFor($object)
  {
    if($this->owner_id === $object->getId())
      return 'owner';
    if('Valtazar' === $object->name)
      return 'approver';
  }
 
  function getResource()
  {
    return 'article';
  }
}
 
class Member implements lmbRoleProviderInterface
{
  public $name;  
 
  function __construct($name)
  {
    $this->name = $name;
  }
 
  function getRole()
  {
    return 'member';
  }
}
 
$member = new Member('Vasya Pupkin');
$approver = new Member('Valtazar');
$owner = new Member('Bob');
$owner->save();
 
$article = new Article();
$article->setOwnerId($owner->getId());
 
$this->acl->addRole('member');
$this->acl->addRole('owner', 'member');
$this->acl->addRole('approver', 'member');
$this->acl->addResource('article');
 
$this->acl->allow('member', 'article', 'view');
$this->acl->allow('owner', 'article', 'edit');
$this->acl->allow('approver', 'article', 'approve');
 
var_dump($this->acl->isAllowed($member, $article, 'view')); //bool(true)
var_dump($this->acl->isAllowed($member, $article, 'edit')); //bool(false)
var_dump($this->acl->isAllowed($member, $article, 'approve')); //bool(false)
 
var_dump($this->acl->isAllowed($owner, $article, 'view')); //bool(true)
var_dump($this->acl->isAllowed($owner, $article, 'edit')); //bool(true)
var_dump($this->acl->isAllowed($owner, $article, 'approve')); //bool(false)
 
var_dump($this->acl->isAllowed($approver, $article, 'view')); //bool(true)
var_dump($this->acl->isAllowed($approver, $article, 'edit')); //bool(false)
var_dump($this->acl->isAllowed($approver, $article, 'approve')); //bool(true)

MACRO тег

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   __ __   __ __  ____    ____   ___ 
  / // /  / // / / __ \  / __/  / _ |
 / _  /  / _  / / /_/ / _\ \   / __ |
/_//_/  /_//_/  \____/ /___/  /_/ |_|
 
limb3/ru/packages/acl.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)