假设有一个论坛有两种用户(管理员和用户),管理员可以关闭一个帖子。在某些页面上,我需要绘制一个按钮来关闭一个帖子。
如果我根据http://www.yiiframework.com/doc-2.0/guide-security-authorization.html在RBAC中对此进行建模,我必须创建角色" adminRole"和" userRole"和权限" closeThread"并将该权限附加到" adminRole"角色。但没有人可以关闭已经关闭的线程。是否应该将这样的支票放入分配给" closeThread"是否允许或被保留在RBAC特定类之外?
变体1.该检查附加于" closeThread"权限:
// Definition of the rule attached to "closeThread" permission:
class CloseThreadRule extends \yii\rbac\Rule
{
public function execute($user, $item, $params)
{
return $params['thread']->is_closed == false;
}
}
// $thread - is an instance of a class representing thread data
if(\yii::$app->user->can('closeThread', ['thread' => $thread]))
/* show "Close Thread" button */;
变体2.检查不在RBAC类之内:
if($thread->is_closed == false && \yii::$app->user->can('closeThread'))
/* show "Close Thread" button */;
根据RBAC方法,哪个是正确的方法(变体1或变体2)?