2012-06-22 12 views
5

Busqué en Google, leí tutoriales, blogs y experimenté mucho. Así que soy capaz de definir el acceso basado en roles a las acciones del controlador. Todo funciona bien. Lo que quiero preguntar es. ¿Cómo puedo escribir una regla para visualizar, editar y eliminar la publicación de un usuario?Acceso basado en funciones Yii, administrando publicaciones propias

Por defecto, muestra todas las publicaciones. Sin embargo, podemos poner los criterios del proveedor de datos para mostrar la publicación propia. ¿Pero cómo puedo controlar el CRUD para eso? Amablemente ayúdame. Mi código está abajo.

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

para la pantalla mensaje:

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

sólo tiene que añadir el identificador de usuario a la esas acciones como tú eres doi ng para acitonIndex '$ this-> userId' – Orlymee

+0

donde en el controlador está configurando el valor' $ this-> userId'? –

Respuesta

3

Para restringir actualizar y eliminar acciones a propios mensajes del usuario, que tendrá que comprobar los permisos dentro de la acción del controlador (esto no es posible en el el controlador de accessRules yo sepa, como el ID del puesto para comprobar permisos para, no se conoce por el momento se evalúan la accessRules)

Ejemplo:.

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

Pero en alguna parte que había visto que podemos poner algo en el accessrul y automáticamente la lista también se modificó para el usuario –

+0

¿Te refieres a esto [Wiki/Tutorial] (http://www.yiiframework.com/wiki/136/ getting-to-understand-hierarchical-rbac-scheme /)? – burnedikt

0

La única manera que puedo pensar en hacer esto es mediante la modificación primero los enlaces que activan las acciones: actualizar, eliminar, ver enviar también el campo added_by junto con el ID del post (ID es enviado por defecto). Luego, en su 'expression' puede verificar si el added_by coincide con su userId. A continuación se muestra un ejemplo de la vista (suponiendo que quiere decir la vista cuando se dice de visualización de su pregunta):

  1. modificaciones accessrule, para que esto funcione asegurarse de que tiene un valor en $this->userId antes de la accessRules se evalúa, que puede hacerse en el método 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 de modificación de añadir added_by Identificación de parámetros de URL. Digamos que tiene las vistas de crud generadas por defecto, concretamente index.php, _view.php, _form.php, _view.php, update.php, etc. donde _view.php tiene el enlace para ir a la vista de detalle de la publicación, este es también el elemento Vista de la vista de lista en index.php. Aquí podemos hacer algunos cambios (_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. Vas a tener que modificar los enlaces para eliminar, actualizar las acciones que pasar también el campo added_by.

Cuestiones relacionadas