Tags

, , ,

Ini tulisan kedua dari tulisan sebelumnya Tutorial yii2-admin 1. Ternyata lebih cepat dari perkiraan semula :D. Kita masih belum akan ke instalasi dan konfigurasi. Kita masih akan mendalami konsep RBAC itu sendiri. Karena secara teori, kalau paham konsep RBAC, harusnya akan lebih mudah menggunakan yii2-admin. Kali ini kita akan bahas lebih banyak tentang rule.

Membuat Rule

Rule dibuat dengan meng-extends class yii\rbac\Rule dan mengoverride method execute(). Kita buat contoh yang lebih mudah dulu. Misal ada user yang sama-sama dapat permission update_post. Tetapi ada tambahan aturan yaitu hanya boleh mengedit artikel yang dia tulis saja. Maka rulenya

namespace app\components;

use yii\rbac\Rule;

class OnlyAuthor extends Rule
{
    public function execute($user, $item, $params)
    {
        $model = $params['post'];
        return $user->id == $model->author_id;
    }
}

Kemudian kita daftarkan rule tersebut lewat menu admin/rule. Selanjutnya rule tersebut kita assign ke permission update_post. Lalu di controllernya kita tulis

public function actionUpdate($id)
{
    $model = $this->findModel($id);
    if(!Yii::$app->user->can('update_post',['post' => $model]){
        throw new ForbiddenHttpException('You are not allowed to perform this action.');
    }
    if ($model->load(Yii::$app->request->post() && ... )) {
        ...

Pertanyaannya. Bisakah kita mendapatkan rule ini secara otomatis seperti dalam AccessControl? Tentu saja bisa. Yii2 itu magic, kita hanya perlu tahu mantra yang tepat untuk memanggil apa yang kita inginkan. Lalu kita akan dapatkan sihir yang kita harapkan.
Lanjut. Karena AccessControl dipanggil sebelum mengeksekusi action, tentu kita tidak bisa memakai model yang diload di action. Kita harus memanfaatkan query params($_GET) dalam rule kita. Class rule nya kita rubah sedikit

    public function execute($user, $item, $params)
    {
        // paramater $params dikirim dari AccessControl dengan nilai dari $_GET
        $model = Post::findOne($params['id']);
        return $model && $user->id == $model->author_id;
    }

Kita tidak perlu lagi menggunakan $user->can() secara manual di controller

public function actionUpdate($id)
{
    $model = $this->findModel($id);
    if ($model->load(Yii::$app->request->post() && ... )) {
        ...

Untuk rule yang lain, silakan kembangkan sendiri sesuai dengan kebutuhan. Kita tunda dulu instalasi dan konfigurasi yii2-admin di tulisan berikutnya. Ada beberapa fitur baru di versi terakhir yang mungkin cukup menarik untuk dikupas. Insyaallah 😀

Advertisements