大家好,我已经看过很多Yii 2 RBAC教程,但我真的不太欣赏如何实现规则。在Yii 2指南中,他们介绍了如何制定规则,但实际上并不是如何在控制器的行为或其他地方实现规则。关于这个问题我真的需要一些启示。
我现在拥有的是一个文件上传系统,我有两个角色,即admin和encoder。基本上,admin角色可以完成所有操作,而编码器角色只能创建,查看拥有,更新拥有和删除拥有。我已经创建了一个名为encodedBy的规则。
这是我在EncoderRule中的代码
namespace app\rbac; use yii\rbac\Rule;
/** * Checks if encoded_by matches user passed via params */ class EncoderRule extends Rule {
public $name = 'encodedBy';
/**
* @param string|integer $user the user ID.
* @param Item $item the role or permission that this rule is associated with
* @param array $params parameters passed to ManagerInterface::checkAccess().
* @return boolean a value indicating whether the rule permits the role or permission it is associated with.
*/
public function execute($user, $item, $params)
{
return isset($params['document']) ? $params['document']->encoded_by == $user : false;
} }
我将数据存储在'document'表中,我有一个名为'encoded_by'的字段。我希望你们可以帮助我。非常感谢!!!
如果我清楚地了解您,您希望使用Yii2 RBAC规则对系统用户(管理员和编码器)实施一些权限。嗯,这在某种程度上非常直接
Yii2有用于此目的的现有表。这些表是我。 auth_assignment ii。 auth_item iii。 auth_item_child iv。 auth_rule
你需要做的第一件事是选择你想要使用哪个authManager的PhpManager或DBManager,但我会建议你使用DBManager的原因是,这是我用的
如果您使用的是Yii2 Basic模板,请在web.php中的组件下添加以下代码行
'authManager' => [
'class' => 'yii\rbac\DbManager',
'defaultRoles' => ['guest'],
],
如果是Yii2 Advanced模板,请在\ common \ config文件夹中的main.php中的组件下添加下面的代码行
完成上述步骤后,
上面的代码将为您生成/创建之前在数据库中自动列出的四个表
创建RBAC规则。
这需要您创建权限和角色。
对于基本模板,
请参阅http://pastebin.com/RAKpZX2J以了解它的外观
对于高级模板, - 创建相同的文件,但它将在console \ controllers \ RbacController.php中
完成所有这些,
如果您成功创建了上述所有内容,您可以执行此类操作以了解用户是否具有权限
if(Yii::$app->user->can('createUser')){
}
我希望这有帮助..
我也在苦苦挣扎。直到现在我才能弄明白,$params['post']
绝对不适合我。我不知道在哪里 - 我应该定义什么才能使它工作。但是我可以弄清楚based on the post of Joel Small,如果我这样做的话(我想简单地拒绝访问更新表格以防某些情况下的模型状态):
应用程序\ RBAC \ ZnwRule.php:
namespace app\rbac;
use yii\rbac\Rule;
use app\models\Znw;
class ZnwRule extends Rule {
public function execute($user, $item, $params) {
$znw = Znw::findOne(\Yii::$app->request->get('id'));
return $znw->created_by || $znw->zwz_id == 0 || !$znw->created_at ? false : true;
}
}
然后在ZnwController中:
public function actionUpdatezd($id) {
if (\Yii::$app->user->can('updatezd')) {
...
} else {
throw new \yii\web\ForbiddenHttpException('Sorry, you are not allowed to do that.');
}
我在yii2-admin中定义了我有一条规则:
名称:ZnwRule
class:app \ rbac \ ZnwRule
我创建了一个名为updatezd
的权限:
name:updatezd
规则:ZnwRule
我已经使用主控制器启动了我的应用程序,我正在检查yii2-admin中是否允许某个角色的路由,并且所有其他控制器都扩展了这个。现在我必须处理权限和规则,我还必须将路由添加到权限。我相信它可以更容易完成,但至少它似乎工作到目前为止。它并不多,但我希望它在某种程度上有所帮助。
如果您需要简单的角色检查,您可以扩展AccessRule
类以适应新角色,而无需深入研究基于角色的访问控制。查看本教程以获取完整的详细信息:Simpler Role Based Authorization in Yii 2.0
这是我发现理解,实现和维护角色的最简单方法,但是为了简单起见,您将权衡完整RBAC提供的广泛灵活性。
完全披露:我是博客文章的作者。
见authorization guide。你可能错过了在AuthManager中分配规则吗?
$auth = Yii::$app->authManager;
$rule = new \app\rbac\EncoderRule; // <- add here
$auth->add($rule);
$encodedByAuthor = $auth->createPermission('encodedByAuthor');
$encodedByAuthor->ruleName = $rule->name; // <- assign here
$auth->add($encodedByAuthor);
...