我正在寻找一种方法,使管理员能够在从后端注册后分配用户角色。我已在yii2 advanced中配置了yii2-admin,并且我已在数据库表中设置了角色。
但是,我希望将用户注册表单上的角色作为下拉列表获取,管理员应该能够选择角色并分配给用户。下拉列表中的角色应该是低于admin的角色或等同于他的角色...即如果存在超级用户的sysadmin角色,则管理员不应该将角色作为自分配以来的选项之一该角色意味着用户将高于他的角色。
我在网上搜索过,但只获得了Yii 1.1的代码,我尝试自定义但完全不起作用。代码如下:
表单上的下拉列表:
<?php
if (Yii::app()->user->isSuperuser) {
$all_roles=new RAuthItemDataProvider('roles', array(
'type'=>2,
));
$data=$all_roles->fetchData();
?>
<div>
<label for="type_id">Type</label>
<?php echo CHtml::dropDownList("Type",'',CHtml::listData($data,'name','name'));? >
</div>
<?php
}
?>
控制器代码是:
if(Yii::app()->user->isSuperuser)
$type=$_POST['Type'];
else
$type='User';
$authorizer = Yii::app()->getModule("rights")->authorizer;
$authorizer->authManager->assign($type, $model->id);
任何想知道如何将其转换为Yii2的人?请协助;我一直坚持这个问题。
谢谢。
答案 0 :(得分:2)
以下是关于如何进行此操作的想法。设置yii2-admin后,设置必要的dbTables并将authManager设置添加到配置部分,如此
$config = [
...
'components' => [
...
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
],
'as access' => [
'class' => 'mdm\admin\components\AccessControl',
'allowActions' => [
'site/*',
//'admin/*',
//'gii/*',
]
],
];
您可以访问authManager组件。
在您的控制器中,您可以获得当前用户的角色,如此
$current_user_roles = Yii::$app->authManager->getRolesByUser(Yii::$app->user->id);
接下来,您可以获得已定义的所有角色的列表
$available_roles = Yii::$app->authManager->getRoles();
从这里开始,您必须应用角色层次结构逻辑来定义此用户可以分配的角色(您应该最终得到此用户无法分配的角色列表,比如说$forbidden_roles
)。一旦有了这两个列表,就可以使用简单的foreach()
语句从$ available roles数组中删除$ forbidden_roles,例如:
foreach($forbidden_roles as $role){
if(in_array($role,$available_role)){
$index = array_search($role,$available_role);
\yii\helpers\ArrayHelper::remove($available_roles,$index);
}
}
现在您有一个包含用户可以分配的角色的数组。将此数组传递给您的视图,然后传递到下拉元素,您应该设置。
我没有亲自试过这个,但让我知道它是否适合你。希望这会有所帮助。
答案 1 :(得分:0)
我在我的应用程序中使用_form
中的以下代码获取加载user_id和所有名称
您只更改查询中的条件
$users= ArrayHelper::map(app\models\User::find()->orderBy('username')->asArray()->all(), 'id', 'username');
$item= ArrayHelper::map(app\models\Authitem::find()->orderBy('name')->asArray()->all(), 'name', 'name');
echo $form->field($model, 'item_name')->widget(Select2::classname(), [
'data' => $item,
'options' => [
'placeholder' => 'انتخاب کنید...',
],
'pluginOptions' => [
'allowClear' => true,
],
]);
?>
<?php
echo $form->field($model, 'user_id')->widget(Select2::classname(), [
'data' => $users,
'options' => [
'placeholder' => 'انتخاب کنید...',
],
'pluginOptions' => [
'allowClear' => true,
],
]);
?>