Pertanyaan Akses berbasis peran Yii, mengelola posting sendiri


Saya googled, membaca tutorial, blog dan banyak bereksperimen. Jadi saya dapat menentukan akses berbasis peran untuk tindakan pengontrol. Semuanya berfungsi dengan baik. Yang ingin saya tanyakan adalah. Bagaimana saya bisa menulis aturan untuk menampilkan, mengedit dan menghapus posting pengguna itu sendiri?

Secara default ini menampilkan semua posting. Namun kita dapat menempatkan kriteria penyedia data untuk menampilkan posting sendiri. Tapi bagaimana saya bisa mengendalikan CRUD untuk itu ?? Mohon bantu saya. Kode saya di bawah.

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

untuk tampilan pos:

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

5
2018-06-22 13:52


asal


Jawaban:


Untuk membatasi pembaruan dan menghapus tindakan ke posting pengguna sendiri, Anda harus memeriksa perizinan di dalam tindakan pengontrol (ini tidak mungkin di controller accessRules afaik, sebagai id dari posting untuk memeriksa perizinan untuk, tidak diketahui pada saat itu accessRules dievaluasi.)

Contoh:

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.');
}

3
2018-06-26 15:38



Gunakan cakupan:

http://www.yiiframework.com/doc/api/1.1/CActiveRecord#scopes-detail

dalam model Anda:

public function scopes()
{
return array(
  'own'=>array(
    'condition'=>'userid=' . Yii::app()->user->id,
  ),
);
}

lalu pilih data Anda seperti ini:

Post::model()->own()->findAll();

1
2017-10-28 04:45



Satu-satunya cara yang dapat saya pikirkan untuk melakukan ini adalah dengan terlebih dahulu memodifikasi tautan yang mengaktifkan tindakan: memperbarui, menghapus, melihat untuk mengirim juga added_by lapangan bersama dengan id posting (id posting dikirim secara default). Kemudian di Anda 'expression' Anda dapat memeriksa apakah added_by cocok dengan Anda userId. Di bawah ini adalah contoh untuk tampilan (dengan asumsi Anda bermaksud melihat ketika Anda mengatakan tampilan dalam pertanyaan Anda):

  1. modifikasi accessRule, agar ini berfungsi pastikan Anda memiliki nilai $this->userId sebelum accessRules dievaluasi, yang bisa dilakukan di init() metode :

    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. lihat modifikasi untuk ditambahkan added_by id ke parameter url. Katakanlah Anda memiliki pandangan mentah mentah yang dihasilkan, yaitu index.php, _view.php, _form.php, _view.php, update.php dll  dimana _view.php memiliki tautan untuk menuju ke detailview posting, ini juga merupakan itemView dari listview di index.php. Di sini kami membuat beberapa perubahan (_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. Anda harus memodifikasi tautan untuk menghapus, memperbarui tindakan untuk juga melewati bidang tambah_by.


0
2018-06-27 10:44