2012-06-22 24 views
5

Ben googled, öğreticiler, bloglar okuyun ve çok denedim. Böylece denetleyici eylemlerine rol tabanlı erişim tanımlayabiliyorum. Her şey yolunda çalışıyor. Ne sormak istiyorum. Kullanıcının kendi gönderisini görüntülemek, düzenlemek ve silmek için nasıl kural yazabilirim?Yii rol tabanlı erişim, kendi gönderilerini yönetme

Varsayılan olarak, tüm gönderileri görüntüler. Ancak kendi yayınını görüntülemek için veri sağlayıcı kriterlerini koyabiliriz. Fakat bunun için CRUD'u nasıl kontrol edebilirim? Lütfen bana yardım edin. Benim kodum feryat. sonrası görüntü için

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('*'), 
      ), 
     ); 
    } 

: güncelleme kısıtlamak ve kullanıcının kendi mesajların eylemler silmek için

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

basitçe için kimliği eklemek tıpkı senin gibi hareketler doi acitonIndex '$ this-> userId ' – Orlymee

+0

için ng Burada denetleyicide' $ this-> userId' değerini ayarlıyorsunuz? –

cevap

3

, denetleyici eylem içindeki izinleri kontrol etmek zorunda kalacak (bu mümkün değildir kontrolörün accessRules afaik, accessRules değerlendirilir zaman bilinmemektedir için mesaj kimliği izinlerini kontrol etmek gibi)

Örnek:.

i bunu düşünebilirsiniz
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

Ama bir yerde accessrul'a bir şey koyabildiğimizi görmüştüm ve otomatik olarak listeleme de kullanıcı için değiştirilmiş –

+0

bu [Wiki/Öğretici] (http://www.yiiframework.com/wiki/136/) Anlamak için-hiyerarşik-rbac-şeması /)? – burnedikt

0

tek yolu ilk eylemleri aktive bağlantıları değiştirerek geçerli: güncelleme, silme, yayının kimliği ile birlikte ayrıca added_by alanını göndermek için görünüm (post id tarafından gönderilen varsayılan). Ardından, 'expression' numaranızda added_by'un userId ile uyumlu olup olmadığını kontrol edebilirsiniz. Aşağıda görünümü için bir örnektir (eğer söz konusu ekranı derken manzaranın demek varsayarak):

  1. accessRule modifikasyonları, bu iş için değerlendirilir Eğer accessRules önce $this->userId bir değer olduğundan emin olun, o can init() yönteminde yapılması:

    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. görünüm modifikasyonu url parametrelerine added_by id ekleyin. index.php, _view.php, _form.php, _view.php, update.php gibi numaralı _view.php bağlantısının ayrıntısına kadar oluşturulmuş varsayılan görünümlere sahip olduğunuzu varsayalım. Bu ayrıca index.php'deki liste görünümünün itemView öğesidir.

    <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. Ayrıca added_by alanını geçmek eylemleri silme için bağlantılar değiştirmek güncellemek gerekecek: Burada birkaç değişiklik (_view.php) yapmak.