2012-06-22 72 views
5

我使用Google搜索,閱讀教程,博客並進行了大量實驗。所以我可以定義基於角色的訪問控制器操作。 一切工作正常。 我想問的是。我如何編寫規則來顯示,編輯和刪除用戶自己的帖子?Yii基於角色的訪問,管理自己的職位

默認情況下,它會顯示所有帖子。但是,我們可以將數據提供者標準顯示爲自己的帖子。但是,我怎樣才能控制CRUD呢? 請幫助我。我的代碼是波紋管。

public function accessRules() { 
     return array(
      array('allow', // allow all users to perform 'index' and 'view' actions 
       'actions' => array('index', 'view'), 
       'users' => array('*'), 
      ), 
      array('allow', // allow authenticated user to perform 'create' and 'update' actions 
       'actions' => array('create', 'update'), 
       'expression' => 'Yii::app()->controller->HaveAccess()', 
       //'users' => array('@'), 
      ), 
      array('allow', // allow admin user to perform 'admin' and 'delete' actions 
       'actions' => array('admin', 'delete'), 
       'expression' => 'Yii::app()->controller->HaveAccess()', 
      ), 
      array('deny', // deny all users 
       'users' => array('*'), 
      ), 
     ); 
    } 

爲後顯示:

public function actionIndex() { 
     $dataProvider = new CActiveDataProvider('Advertisment'); 
     if (!$this->IsAdmin()) { 
      $dataProvider = new CActiveDataProvider('Advertisment', array(
         'criteria' => array(
          'condition' => 'added_by='.$this->userId, 
          'order' => 'id DESC', 
         ), 
         'pagination' => array(
          'pageSize' => 20, 
         ), 
        )); 
     } 
     $this->render('index', array(
      'dataProvider' => $dataProvider, 
     )); 
    } 
+2

只需將用戶ID添加到像你一樣的行爲是doi ng for acitonIndex'$ this-> userId' – Orlymee

+0

在控制器中的哪個位置設置'$ this-> userId'的值? –

回答

3

要限制更新和刪除操作,以用戶自己的帖子,你將不得不檢查控制器的動作裏面的權限(這是不可能的控制器的accessRules AFAIK,作爲後的id來檢查權限,沒有被accessRules被評估時已知)

例:

public function actionUpdate($id){ 
    $model = $this->loadModel($id); 
    if($model->added_by === $this->userId){ 
     // your code here 
    }else 
     throw new CHttpException(401,'You are not authorized to edit this post.'); 
} 
+0

但是在某個地方,我看到我們可以在accessrul中加入一些東西,並自動爲用戶修改列表 –

+0

您是在引用這個[Wiki/Tutorial](http://www.yiiframework.com/wiki/136/)理解層次結構rbac-scheme /)? – burnedikt

0

我能想到這樣做的唯一方法是先修改激活操作的鏈接:更新,刪除,查看也與該帖子的ID一起發送added_by場(帖子ID被髮送默認)。然後在您的'expression'中,您可以檢查added_by是否與您的userId相符。下面是圖的實例(假設你的意思視圖,當你在你的問題顯示):

  1. accessRule修改,這個工作要確保你有accessRules前$this->userId的值進行評估,可在init()方法來完成:

    return array(
        array('allow', // allow all users to perform 'index' actions 
         'actions' => array('index'), 
         'users' => array('*'), 
        ), 
        array('allow', // allow authenticated user to perform 'create' and 'update' actions 
         'actions' => array('create', 'admin'), 
         'expression' => 'Yii::app()->controller->HaveAccess()', 
         //'users' => array('@'), 
        ), 
        array('allow', // allow admin user to perform 'admin' and 'delete' actions 
         'actions' => array('view', 'delete', 'update'), 
         'expression' => 'Yii::app()->controller->HaveAccess() && ($_REQUEST["added_by"]=='.$this->userId.")", 
        ), 
        array('deny', // deny all users 
         'users' => array('*'), 
        ), 
    ); 
    
  2. 視圖修飾added_by ID添加到URL參數。假設您有默認生成的crud視圖,即index.php,_view.php,_form.php,_view.php,update.php等其中_view.php有鏈接可以轉到帖子的詳細視圖,這也是index.php中listview的itemView。在這裏,我們做一些修改(_view.php):

    <div class="view"> 
    
        <b><?php echo CHtml::encode($data->getAttributeLabel('id')); ?>:</b> 
        <?php echo CHtml::link(CHtml::encode($data->id), array('view', 'id'=>$data->id,'added_by'=>$data->added_by)); ?> 
        <br /> 
    
        <b><?php echo CHtml::encode($data->getAttributeLabel('someattribute')); ?>:</b> 
        <?php echo CHtml::encode($data->someattribute); ?> 
        <br /> 
    
        <!-- more attributes--> 
    
    
    </div> 
    
  3. 你必須修改刪除的鏈接,更新操作也通過added_by領域。

相關問題