Наследование bizRule

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Аватара пользователя
SiZE
Сообщения: 2818
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Наследование bizRule

Сообщение SiZE »

Сперва немного кода, потом вопросы

Код: Выделить всё

// main.php
'authManager' => array(
    'class' => 'CPhpAuthManager',
    'defaultRoles' => array('guest','authenticated','applicant','admin')
),
 

Код: Выделить всё

<?php
// auth.php
return array(
    // ...
    'authenticated' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Пользователь',
        'children' => array( 'guest' ),
        'bizRule' => 'return !Yii::app()->user->isGuest ? true : false;',
        'data' => null
    ),
    'applicant' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Соискатель',
        'children' => array( 'authenticated' ),
        'data' => null
    ),
    // ...
Попробуем авторизоваться и проверить роли

Код: Выделить всё

var_dump(
    'Authenticated', $this->checkAccess('authenticated'),
    'Applicant', $this->checkAccess('applicant')
);

// Результат
// string(13) "Authenticated" bool(true)
// string(9) "Applicant" bool(true)
отлично, все устраивает. Попробую поменять bizRule для authenticated на

Код: Выделить всё

'bizRule' => 'return false;',

// Результат того же var_dump
// string(13) "Authenticated" bool(false)
// string(9) "Applicant" bool(true)
хм.. странно. Мы ведь унаследовали applicant от authenticated. Смотрим место где идет проверка CPhpAuthManager->checkAccess сразу доходим до места

Код: Выделить всё

if(in_array($itemName,$this->defaultRoles)) 
return true;
Т.к. в нашем конфиге роль applicant задана, попробуем ее убрать из defaultRoles, чтобы проверка прошла дальше. А дальше она доходит до цикла.

Код: Выделить всё

foreach($this->_children as $parentName=>$children)
{
    if(isset($children[$itemName]) && $this->checkAccess($parentName,$userId,$params))
        return true;
}
И я никак не пойму, это бага или фича?

1. Если роль задана в defaultRoles, то как ни указывай children

Код: Выделить всё

'authenticated' => array(
  'children' => array( 'applicant' ),
)
// или
'applicant' => array(
  'children' => array( 'authenticated' )
)
правило bizRule указанное в authenticated на нашу роль applicant никак не повлияет.

2. Если же мы уберем нашу роль из defaultRoles, то проверка дойдет до цикла, в котором по логике цикла мы должны указать children вот так:

Код: Выделить всё

'authenticated' => array(
  'children' => array( 'applicant' ),
)
и в этом же случае правило указанное для applicant будет проигнорировано, а использовано только указанное в authenticated.

По моей логике это должно работать так. У нас есть роль authenticated, мы от нее наследуем роль applicant. И три правила: 1) если bizRule у authenticated возвращает TRUE, а у applicant оно не указано, то в целом checkAccess возвращает true. 2) Если у applicant указан свой bizRule то checkAccess уже ориентируется на него. 3) Надо иметь возможность проверить что возвращает родительская роль. Т.е. в bizRule для applicant укзазать что то типа: return $checkParentAccess && $myExpressionReturnBoolValue;
Аватара пользователя
SiZE
Сообщения: 2818
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Наследование bizRule

Сообщение SiZE »

Еще немного подумал. Если мы не задали пользователю роль и не указали ее в defaultRoles, то логично поискать у этого пользователя другие роли, которые унаследованы от проверяемой роли. Поэтому пункт 2 из моего вопроса становится более менее логичен. Т.е. мы нашли элемент, у которого в children'ах числится наша роль, проверили права этого элемента и вернули пользователю. Но тогда получается наследование работает в обратном порядке. Т.е. роль authenticated должна знать что есть к примеру роли applicant, admin и тп. И в таком случае мы не сможем для ролей applicant, admin и тп., задать какие либо правила проверки.
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Наследование bizRule

Сообщение lancedevnull »

SiZE писал(а):

Код: Выделить всё

'authenticated' => array(
  'children' => array( 'applicant' ),
)
// или
'applicant' => array(
  'children' => array( 'authenticated' )
)
 
роли конечно это граф, но не до такой же степени :o
Аватара пользователя
SiZE
Сообщения: 2818
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Наследование bizRule

Сообщение SiZE »

lancedevnull писал(а):роли конечно это граф, но не до такой же степени :o
подразумевается использование children только в одном месте, там "или" стоит.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Наследование bizRule

Сообщение Ekstazi »

Возможно вам поможет эта статья: http://habrahabr.ru/post/177873/
Аватара пользователя
SiZE
Сообщения: 2818
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Наследование bizRule

Сообщение SiZE »

Ekstazi писал(а):Возможно вам поможет эта статья: http://habrahabr.ru/post/177873/
Мне она помогла когда я только подходил к снаряду. Я знаю как это все работает в Й. Мне не понятно, почему задавая для роли, другую роль, мы не получаем никаких проверок от той роли. Т.е. почему разработчики это не предусмотрели или не подумали или планировано не захотели сделать. :?:
Ответить