vova07 / yii2-start-rbac-module

The RBAC module for Yii2-Start application.
12 stars 6 forks source link

Removing unsupported object type. #1

Open loveorigami opened 9 years ago

loveorigami commented 9 years ago

Здравствуйте, Василий. Изучаю ваши модули. Возник вопрос по разрешениям.

по аналогии с Вашим классом в комментариях https://github.com/vova07/yii2-start-comments-module/blob/master/commands/RbacController.php

, написал

class ArticleController extends Controller{
    /**
     * @inheritdoc
     */
    public $defaultAction = 'add';
    /**
     * @var array Main module permission array
     */
    public $mainPermission = [
        'name' => 'administrateArticles',
        'description' => 'Can administrate all "Articles" module'
    ];
    /**
     * @var array Permission
     */
    public $permissions = [

        'BViewArticles' => [
            'description' => 'Can view backend articles list'
        ],
        'BUpdateArticles' => [
            'description' => 'Can update backend articles'
        ],
// more permissions
    ];

    /**
     * Add Articles RBAC.
     */
    public function actionAdd()
    {
        $auth = Yii::$app->authManager;
        $root = $auth->getRole('root');
// some code............................

        return static::EXIT_CODE_NORMAL;
    }

    /**
     * Remove articles RBAC.
     */
    public function actionRemove()
    {
        $auth = Yii::$app->authManager;
        $permissions = array_keys($this->permissions);
        foreach ($permissions as $name => $option) {
            $permission = $auth->getPermission($name);
//var_dump($permission); // тут показывает NULL
            $auth->remove($permission);
        }
        $mainPermission = $auth->getPermission($this->mainPermission['name']);
        $auth->remove($mainPermission);
        return static::EXIT_CODE_NORMAL;
    }
} 
Exception 'yii\base\InvalidParamException' with message 'Removing unsupported object type.'

in \vendor\yiisoft\yii2\rbac\BaseManager.php:136

сама функция тут https://github.com/yiisoft/yii2/blob/master/framework/rbac/BaseManager.php#L129

вывел var_dump($permission); - - у меня показывает NULL


p.s. - вначале вопрос был по этому модулю, но в процессе я его решил, но заметил другую ошибку. Так что извините, что не там написал issue

vova07 commented 9 years ago

А вы создаете permission или все же role? Покажите пожалуйста вот эту часть:

$root = $auth->getRole('root');
// some code............................
loveorigami commented 9 years ago

Вот так вот у меня

 /**
     * Add Articles RBAC.
     */
    public function actionAdd()
    {
        $auth = Yii::$app->authManager;
        $root = $auth->getRole('root');
        $mainPermission = $auth->createPermission($this->mainPermission['name']);

        if (isset($this->mainPermission['description'])) {
            $mainPermission->description = $this->mainPermission['description'];
        }
        if (isset($this->mainPermission['rule'])) {
            $mainPermission->ruleName = $this->mainPermission['rule'];
        }
        $auth->add($mainPermission);

        foreach ($this->permissions as $name => $option) {
            $permission = $auth->createPermission($name);
            if (isset($option['description'])) {
                $permission->description = $option['description'];
            }
            if (isset($option['rule'])) {
                $permission->ruleName = $option['rule'];
            }
            $auth->add($permission);
            $auth->addChild($mainPermission, $permission);
        }
        $auth->addChild($root, $mainPermission);

        $updateArticles = $auth->getPermission('updateArticles');
        $updateOwnArticles = $auth->getPermission('updateOwnArticles');
        $deleteArticles = $auth->getPermission('deleteArticles');
        $deleteOwnArticles = $auth->getPermission('deleteOwnArticles');

        $auth->addChild($updateArticles, $updateOwnArticles);
        $auth->addChild($deleteArticles, $deleteOwnArticles);

        $admin = $auth->getRole('admin');
        $auth->addChild($admin, $updateArticles);
        $auth->addChild($admin, $deleteArticles);

        return static::EXIT_CODE_NORMAL;
    }

как и у Вас - https://github.com/vova07/yii2-start-comments-module/blob/master/commands/RbacController.php

loveorigami commented 9 years ago

в общем, получилось. должно быть так

        foreach ($permissions as $name => $option) {
            //echo $option;
            $permission = $auth->getPermission($option); // вместо $name

            $auth->remove($permission);
           // var_dump($permission);
        }

https://github.com/vova07/yii2-start-comments-module/blob/master/commands/RbacController.php#L126

но остались записи в rbac_auth_item_child. Наверное, вместо $auth->remove нужно использовать что-то другое?