2012-06-22 10 views
5

Ho cercato su google, ho letto tutorial, blog e ho sperimentato molto. Quindi sono in grado di definire l'accesso basato sul ruolo alle azioni del controller. Tutto funziona bene. Quello che voglio chiedere è. Come posso scrivere una regola per visualizzare, modificare ed eliminare il post di un utente?Accesso basato su ruolo Yii, gestione dei propri messaggi

Per impostazione predefinita visualizza tutti i messaggi. Tuttavia, possiamo mettere i criteri del fornitore di dati per mostrare il proprio post. Ma come posso controllare il CRUD per quello ?? Gentilmente aiutami. Il mio codice è muggito.

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

per la visualizzazione del messaggio:

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

È sufficiente aggiungere l'ID utente al quelle azioni come te sono doi ng per acitonIndex '$ this-> userId' – Orlymee

+0

dove nel controller stai impostando il valore' $ this-> userId'? –

risposta

3

Per limitare aggiornare e cancellare le azioni di possedere i messaggi degli utenti, si dovrà controllare le autorizzazioni all'interno della azione di controllo (questo non è possibile nel controllore di accessRules afaik, come l'id del post per controllare le autorizzazioni per, non è noto dal momento in cui il accessRules vengono valutati)

Esempio:.

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

Ma da qualche parte ho visto che possiamo mettere qualcosa nell'accesso e automaticamente l'elenco viene modificato anche per l'utente –

+0

stai facendo riferimento a questo [Wiki/Tutorial] (http://www.yiiframework.com/wiki/136/ get-to-understand-hierarchical-rbac-scheme /)? – burnedikt

0

L'unico modo che posso pensare di fare questo è in primo luogo modificando i link che attivano le azioni: aggiornamento, eliminare, visualizzare di inviare anche il campo added_by insieme con id del messaggio (posta id viene inviato dal predefinito). Quindi nel tuo 'expression' puoi verificare se lo added_by corrisponde al tuo userId. Di seguito è riportato un esempio per la vista (supponendo che si intende visualizzazione quando si dice visualizzazione nella tua domanda):

  1. modifiche AccessRule, per far funzionare tutto questo assicurarsi di avere un valore nella $this->userId prima della accessRules viene valutata, che possono essere fatto nel metodo 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. vista modifica per aggiungere added_by id di parametri URL. Supponiamo che tu abbia le viste crude generate di default, ovvero index.php, _view.php, _form.php, _view.php, update.php ecc dove _view.php ha il link per andare al dettaglioview del post, questo è anche il itemView del listview in index.php. Qui si apportare alcune modifiche (_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. dovrete modificare i collegamenti per cancellare, aggiornare le azioni di passare anche il campo added_by.

Problemi correlati