2017-05-24 22 views
1

我正在尋找一種方法來讓管理員在從後端註冊用戶後分配用戶角色。我在yii2 advanced中配置了yii2-admin,並且我已經在數據庫表中設置了角色。Yii2-admin RBAC:從數據庫獲取角色並在註冊/用戶註冊時顯示爲Dropdownlist

但是我想將用戶註冊表單上的角色作爲下拉列表,管理員應該能夠選擇角色並分配給用戶。下拉列表中的角色應該低於管理員角色或等同於他的角色...即,如果有超級用戶的系統管理員角色,則管理員應該無法將角色作爲分配後的選項之一那個角色意味着用戶將會比他的角色更高。

我已經在網上搜索,但只得到了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?請協助;我一直在這個問題上停留了一段時間。

謝謝。

回答

2

下面是關於如何入手的想法這個。已經設立yii2管理員,設置必要的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)。一旦你有這些2列出了可以用一個簡單的foreach()語句中刪除從$可用角色數組$ 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); 
    } 
} 

現在你有一個角色,用戶可以指定一個數組。將這個數組傳遞給你的視圖,然後傳遞給下拉元素,你應該設置。

我沒有親自嘗試過,但讓我知道它是否適合你。希望這可以幫助。

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, 
     ], 
    ]); 
    ?>