我正在使用 yii2 basic 并实现了 RBAC。
我有两个角色 admin 和 fieldofficer,并创建了权限和规则并分配了用户。现在,当管理员登录时,在索引页面上,他应该能够看到所有记录以及他在网格中创建的记录。
而当外勤人员登录时,他应该只能在索引页面中看到他创建的记录。
如何做到这一点?
我正在使用 yii2 basic 并实现了 RBAC。
我有两个角色 admin 和 fieldofficer,并创建了权限和规则并分配了用户。现在,当管理员登录时,在索引页面上,他应该能够看到所有记录以及他在网格中创建的记录。
而当外勤人员登录时,他应该只能在索引页面中看到他创建的记录。
如何做到这一点?
您需要将用户的 id 预加载到搜索模型中。如果安全是一个问题(即:无论如何,您不希望其他用户能够绕过此问题),那么您将需要检测用户的 id 是否已传递给查询,并将其强制返回给用户你想要的(即:登录的那个)。在大多数情况下,您将需要额外的安全性,并且应该这样做。
替换UserPlan
为您的模型。由于您没有发布代码,我不知道它是什么:)
之前:原始索引示例(由 Gii 生成):
public function actionIndex()
{
$searchModel = new UserPlanSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
之后:锁定到当前登录的用户:
public function actionIndex()
{
$searchModel = new UserPlanSearch();
$searchModel->user_id = Yii::$app->user->id;
// override (so users can't bypass)
$queryParams = Yii::$app->request->queryParams;
if ( isset($queryParams['UserPlan']['user_id']) ) {
$queryParams['UserPlan']['user_id'] = Yii::$app->user->id;
}
$dataProvider = $searchModel->search($queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
此外,除非您想要一堆反对票,否则您应该在发布到 StackOverflow 时发布代码。只是问问题,是违反规则的。他们想看看你到目前为止已经尝试过什么,以及一些可以参考的代码。