到目前为止,我一直在使用Yii 1.1.14开发网络应用程序,但现在是升级的时候了。
我工作的公司已经开发了自己的访问控制系统,直到我看到它真正的样子我才真的很好...数据库中8个表的组合(不包括用户表),带着一堆外键。
它运行良好,但在我看来,维护所有这些表非常耗时,并且在某些时候,当您的应用程序上线时,如果它遇到一定数量的用户,它可能会变得非常慢。特别是因为其中2个表将用户的表主键作为外键。
所以我决定,当我开始开发Yii 2时,我将开始使用RBAC,所以我开始在线寻找教程......只找到许多不同版本的相同代码和作者的角色,以及创建或更新帖子的权限。
我在Youtube上找到了5个视频的组合,但它们是关于Yii 1 RBAC的。他们很有帮助,因为我设法理解了RBAC的大部分功能,但我仍然有些怀疑 列举如下。请记住,对于此访问控制系统,我使用 DBManager 类。
我的怀疑
Yii 1的RBAC曾经有3个表:auth_assignment
,auth_item
和auth_item_child
。现在在Yii 2 RBAC中,出现了一个名为auth_rule
的新表,我仍然不明白该特定表在那里做了什么,如何使用它或如何填充它。
我看到可以通过使用控制器的行为方法限制用户对某些操作的访问,并根据用户的角色分配对某些操作的访问权限,但是当涉及到这一点时,我必须分开我的问题进入2:
2.1。 首先:如果您可以通过在behavior方法中设置操作来限制对操作的访问,那么将权限保存到auth_item
表有什么用?
2.2。 第二:如果您决定根据权限控制访问权限,那么您究竟是如何做到的,因为我发现自己在每个函数中编写了以下类型的代码,我不认为使用RBAC应该是这个乏味的。必须有另一种方式。
public function actionView($id)
{
if(Yii::$app->user->can('view-users')){
return $this->render('view', [
'model' => $this->findModel($id),
]);
}else{
#Redirect to a custom made action that will show a view
#with a custom error message
$this->redirect(['//site/notauthorized']);
}
}
由于我们现在使用的访问控制系统,当用户登录时,会执行一个复杂的查询,最终会返回一个将保存为会话变量的数组,并将用于创建一个菜单,其中包含与菜单类别一样多的下拉列表,即用户有权访问的控制器。如何用RBAC完成这项工作?
答案 0 :(得分:2)
我只能回答你的问题的2.2,因为3听起来并不像RBAC应该做的那样。但是,如果您遵循与控制器或操作匹配的命名约定,则可以从规则表中获取所需的信息。
开始回答2.2:
你可以简单地设置这样的行为:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['view'],
'roles' => ['view-users'], //<-- Note, rule instead of role
],
]
]
}
这并不能解决“查看自己的用户”的不同问题。样式权限,因为这需要检查ActiveRecord模型(好吧,至少它在我的应用程序中)。如果您想实现这一目标,请在Yii论坛中查看我的帖子:
答案 1 :(得分:1)
我在最简单的方法中使用它,我在控制器的行为中使用它们。
public function behaviors()
{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['sysadmin'],
'actions' => ['index','view','update'],
],
[
'allow' => true,
'roles' => ['staff'],
'actions' => ['index','create','update','view'],
],
],
],
];
}
此处角色是在数据库的auth-item表中创建的角色,它们已在auth-assignment表中分配给用户。在行为中我们只是如上所述使用它。在上面的代码中,sysadmin可以访问索引,查看和更新操作,而员工可以访问索引,创建,更新和查看操作。
答案 2 :(得分:0)
在控制器AccessControl下使用RBAC时,Yii2需要一些设置。我通过制作自己的AccessRule文件解决了这个问题。
namespace app\components;
use Yii;
class AccessRule extends \yii\filters\AccessRule
{
protected function matchRole($user)
{
if (empty($this->roles)) {
return true;
}
foreach ($this->roles as $role) {
if(Yii::$app->authManager->checkAccess($user->identity->code, $role))
return true;
}
return false;
}
然后在你的控制器中你可以使用这样的东西:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'ruleConfig' => [
'class' => 'app\components\AccessRule'
],
'rules' => [
[
'actions' => ['index', 'resource-type'],
'allow'=> true,
'roles' => ['admin'],
],
],
],
];
}
其中admin被定义为auth_item且用户位于auth_item_assignments中。
答案 3 :(得分:0)
我为yii2创建了一个新的Rbac系统。您可以直接获得某个操作的权限,操作会显示您不是此操作的授权。
通过这种方式,您会发现只提供需要识别的操作的访问权限。
我在此处上传了我的详细信息,您可以找到很多解决方案here。
答案 4 :(得分:0)
这是我在面对通过权限过滤访问权限时可以提出的最佳解决方案,这很麻烦,但如果您尝试在富有成效的环境中创建角色并希望使用rbac。
use yii\web\ForbiddenHttpException;
if(Yii::$app->user->can('view-users')){
return $this->render('view', [
'model' => $this->findModel($id),
]);
}else{
throw new ForbiddenHttpException('You dont have access to this site');
}