【问题标题】:How to check access to certain attributes of a model in Yii?如何在 Yii 中检查对模型某些属性的访问?
【发布时间】:2015-06-14 15:32:33
【问题描述】:

使用 Yii 框架我遇到了一个我自己无法解决的问题。

我如何很好地检查对模型某些属性的访问?

上下文:

  • 我使用 RBAC,一个用户可能同时拥有多个角色
  • 我有一个带有一堆属性的模型(例如,我们称之为 Profile)
  • 有些属性是允许任何注册用户编辑的(emailagefavorite color等),还有一些——只有特定角色的用户才能编辑(is_banned——可以修改)由版主或管理员,balance - 只能由管理员等更改)

我已经做过的事情: 目前我只看到一种可能的方法来完成这项任务:

function actionUpdate($id)
{
    $model = Profile::model()->findByPk($id);

    if (!$this->user->checkAccess('editProfile')) {
        throw new AccessDeniedException();
    }
    if (isset($_POST['is_banned'])) {
        if (!$this->user->checkAccess('toggleBan')) {
            unset($_POST['is_banned']);
        }
    }
    if (isset($_POST['balance'])) {
        if (!$this->user->checkAccess('changeBalance')) {
            unset($_POST['balance']);
        }
    }

    $model->setAttributes($_POST);
    $model->save();
}

有没有更好的方法来解决这样的任务?谢谢。

【问题讨论】:

    标签: php yii model rbac


    【解决方案1】:

    考虑使用模型场景(http://www.yiiframework.com/wiki/266/understanding-scenarios/):

    1. 将场景条件添加到您的模型规则中:

      公共功能规则() { 返回数组( 数组('平衡','整数','on' => 'admin'), ); }
    2. 在控制器中设置模型场景:

      if ($this->user->checkAccess('admin')) { $model->scenario = 'admin'; }

    现在只保存场景可用的属性。 还可以考虑在搜索模型中使用场景。

    【讨论】:

    • 据我所知,Yii 不能同时处理多个场景。这就是为什么此解决方案可能不适用于 RBAC,因为一个用户可以拥有多个角色。
    猜你喜欢
    • 2013-05-28
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多