Параметры для IWebUser::checkAccess() в CAccessControlFilter

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Параметры для IWebUser::checkAccess() в CAccessControlFilter

Сообщение mrix »

Всем привет.
Почему бы не сделать поддержку параметров для IWebUser::checkAccess($itemName, $params) в фильтре контроллера accessRules?

Ничего не сломается, если применить такие изменения:

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

class CAccessControlFilter extends CFilter
{
    /**
     * @param array $rules list of access rules.
     */
    public function setRules($rules)
    {
        foreach($rules as $rule)
        {
            if(is_array($rule) && isset($rule[0]))
            {
                $r=new CAccessRule;
                $r->allow=$rule[0]==='allow';
                foreach(array_slice($rule,1) as $name=>$value)
                {
                    if($name==='expression' || $name==='roles' || $name==='message' || $name === 'params')
                        $r->$name=$value;
                    else
                        $r->$name=array_map('strtolower',$value);
                }
                $this->_rules[]=$r;
            }
        }
    }

....
}

class CAccessRule extends CComponent
{

....

    /**
     * @var array Дополнительные параметры для проверки доступа по ролям {@link IWebUser::checkAccess()}
     */
    public $params = array();

....

    /**
     * @param IWebUser $user the user object
     * @return boolean whether the rule applies to the role
     */
    protected function isRoleMatched($user)
    {
        if(empty($this->roles))
            return true;
        foreach($this->roles as $role)
        {
            if($user->checkAccess($role, $this->params))
                return true;
        }
        return false;
    }

....
} 
Или что-то в этом духе.

Я понимаю, что можно написать фильтр. Но иногда проще сделать:

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

class PostController extends CController
{
    /**
     * @var Post Сохранённая модель
     */ 
    private $_model = null;
    
    /**
     * Фильтры действий
     * 
     * @return array Фильтры действий
     */
    public function filters()
    {
        return array
        (
            //контроль по ролям
            'accessControl',
        );
    }
    
    /**
     * Базовые правила доступа к страницам
     * 
     * @return array
     */
    public function accessRules()
    {
        return array
        (
            //просмотр
            array
            (
                'allow',
                'actions' => array('view', 'index'),
                'users' => array('*'),
            ),
            //создание
            array
            (
                'allow',
                'actions' => array('create'),
                'users' => array('@'),
                'roles' => array('admin', 'createPost'),
            ),
            //редактирование
            array
            (
                'allow',
                'actions' => array('update'),
                'users' => array('@'),
                'roles' => array('admin', 'updatePost'),
                'params' => $this->getAction()->getId() === 'update' ? array('model' => $this->loadModel()) : array(),
            ),
            //удаление
            array
            (
                'allow',
                'actions' => array('delete'),
                'users' => array('@'),
                'roles' => array('admin', 'deletePost'),
                'params' => $this->getAction()->getId() === 'delete' ? array('model' => $this->loadModel()) : array(),
            ),
            
            //остальное запретить всем
            array
            (
                'deny',
                'users' => array('*'),
            ),
        );
    }
....
} 
Всё, что нашёл по данному вопросу http://www.yiiframework.com/forum/index ... ol-filter/.
Может быть, уже обсуждалось.
Ответить