2012-06-22 37 views
5

Tôi googled, đọc hướng dẫn, blog và thử nghiệm rất nhiều. Vì vậy, tôi có thể xác định vai trò dựa trên truy cập vào hành động điều khiển. Mọi thứ đều hoạt động tốt. Điều tôi muốn hỏi là. Làm cách nào tôi có thể viết quy tắc để hiển thị, chỉnh sửa và xóa bài đăng của riêng người dùng?Truy cập dựa trên vai trò của Yii, quản lý các bài đăng của riêng mình

Theo mặc định, nó hiển thị tất cả bài đăng. Tuy nhiên, chúng tôi có thể đặt tiêu chí của nhà cung cấp dữ liệu để hiển thị bài đăng của riêng mình. Nhưng làm thế nào tôi có thể kiểm soát CRUD cho điều đó ?? Vui lòng giúp tôi. Mã của tôi là dưới đây.

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

cho bài display:

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

chỉ cần thêm userid đến những hành động giống như bạn là doi ng cho acitonIndex '$ this-> userId' – Orlymee

+0

nơi trong controller bạn thiết lập' $ this-> userId' value? –

Trả lời

3

Để hạn chế cập nhật và xóa các hành động để viết riêng của người dùng, bạn sẽ phải kiểm tra quyền bên trong hành động điều khiển (điều này là không thể thực hiện trong của bộ điều khiển accessRules afaik, làm id của bài đăng để kiểm tra quyền, không được biết đến khi thời gian accessRules được đánh giá.)

Ví dụ:

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

Nhưng một nơi nào đó tôi đã thấy rằng chúng tôi có thể đặt một cái gì đó trong accessrul và tự động danh sách cũng được sửa đổi cho người dùng –

+0

là bạn đề cập đến [Wiki/Hướng dẫn] này (http://www.yiiframework.com/wiki/136/ get-to-understand-hierarchical-rbac-scheme /)? – burnedikt

0

Cách duy nhất tôi có thể nghĩ để làm điều này là bằng cách đầu tiên thay đổi các liên kết mà kích hoạt các hành động: cập nhật, xóa, xem để gửi cũng là lĩnh vực added_by cùng với id của bài (bài id được gửi qua mặc định). Sau đó, trong số 'expression', bạn có thể kiểm tra xem added_by có khớp với số userId của mình không. Dưới đây là một ví dụ cho quan điểm (giả sử bạn có nghĩa là xem khi bạn nói trưng bày trong câu hỏi của bạn):

  1. sửa đổi accessRule, để làm việc này đảm bảo bạn có một giá trị trong $this->userId trước accessRules được đánh giá, mà có thể được thực hiện trong phương pháp 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. xem sửa đổi để thêm added_by id để thông số url. Giả sử bạn có chế độ xem crud được tạo mặc định, cụ thể là index.php, _view.php, _form.php, _view.php, update.php v.v. trong đó _view.php có liên kết để xem chi tiết bài đăng, đây cũng là itemView của listview trong index.php. Ở đây chúng ta thực hiện một vài thay đổi (_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. Bạn sẽ phải thay đổi các liên kết cho xóa, cập nhật các hoạt động cũng để vượt qua lĩnh vực added_by.

Các vấn đề liên quan