如何使用Yii2中的基本模板为用户分配角色?

时间:2016-01-22 04:09:41

标签: yii2 rbac

http://www.yiiframework.com/doc-2.0/guide-security-authorization.html#role-based-access-control-rbac

在文档中,它表示您可以使用以下代码在高级模板中将角色分配给用户:

public function signup()
{
    if ($this->validate()) {
        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->password);
        $user->generateAuthKey();
        $user->save(false);

        // the following three lines were added:
        $auth = Yii::$app->authManager;
        $authorRole = $auth->getRole('author');
        $auth->assign($authorRole, $user->getId());

        return $user;
    }

    return null;
}

问题是我使用的是基本模板。有没有办法在基本模板中执行此操作?

我考虑过使用afterSave方法;但是,我不知道该怎么做。

public function afterSave($insert)
{

}

关于如何做到的任何想法?

public function afterSave($insert)
{
    $auth = Yii::$app->authManager;
    $authorRole = $auth->getRole('author');
    $auth->assign($authorRole, $this->Id());
}

我认为这可行,但我不完全确定。

1 个答案:

答案 0 :(得分:3)

它不依赖于使用的模板。

你的例子是正确的,除了很少的东西。

$this->Id()应替换为$this->id(假设用户表的主键名为id)。

请注意,您还需要调用afterSave()方法的父实现,但您错过了$changedAttributes参数:

/**
 * @inheritdoc
 */ 
public function afterSave($insert, $changedAttributes)
{
    $auth = Yii::$app->authManager;
    $authorRole = $auth->getRole('author');
    $auth->assign($authorRole, $this->id);

    parent::afterSave($insert, $changedAttributes);
}

为了进一步改进,您可以将保存包装在事务中,因此如果afterSave()中的某些内容失败,则不保存模型(在模型保存在数据库中后执行afterSave()事件处理程序。)

您也可以将角色逻辑分配给单独的方法。

请注意,使用此逻辑,每个注册用户都将拥有该角色。你可以用一些条件包装它,但是通过管理界面分配角色会更好。

您可以在this extension中看到它是如何实现的。例如,您可以创建单独的表单,操作并使用附加图标扩展GridView ActionColumn以分配角色。