Access Control Lists Phalcon

Phalcon \ Acl menyediakan manajemen ACL yang mudah dan ringan, serta izin yang menyertainya. Access Control Lists (ACL) memungkinkan sebuah aplikasi untuk mengontrol akses ke area-area dan objek-objek yang terkait suatu permintaan. Anda dianjurkan untuk membaca lebih lanjut tentang metodologi ACL sehingga menjadi akrab dengan berbagai konsepnya.

Singkatnya, Access Control Lists Phalcon memiliki role dan resource. Resource adalah obyek yang mengikuti  perizinan yg ditetapkan padanya melalui ACL. Role adalah objek yang meminta akses ke resource tertentu dan dapat diizinkan atau ditolak akses oleh mekanisme ACL.

Membuat ACL 

Komponen ini awalnya dirancang untuk bekerja dalam memori. Hal ini memberikan kemudahan penggunaan dan kecepatan dalam mengakses setiap aspek dari daftar tsb.  konstruktor Phalcon \ Acl menerima parameter pertama berupa adaptor yg digunakan untuk menerima informasi yang berkaitan dengan daftar kontrol. Contoh di bawah ini menggunakan adaptor memori :

<?php $acl = new \Phalcon\Acl\Adapter\Memory();

Secara default Phalcon \ Acl memungkinkan akses ke action pada resource yang belum belum ditetapkan. Untuk meningkatkan tingkat keamanan dari daftar akses kita dapat mendefinisikan “deny” sebagai tingkat akses default.

<?php

// Default action is deny access
$acl->setDefaultAction(Phalcon\Acl::DENY);

Menambahkan Role ke ACL 

Role adalah sebuah objek yang dapat atau tidak dapat mengakses resource tertentu dalam daftar akses. Sebagai contoh, kita akan mendefinisikan role sebagai kelompok orang dalam suatu organisasi. Kelas Phalcon \ Acl \ Role disediakan untuk menciptakan role dgn cara yang lebih terstruktur. Mari kita tambahkan beberapa role ke daftar yg baru dibuat:

<?php

// Create some roles
$roleAdmins = new \Phalcon\Acl\Role("Administrators", "Super-User role");
$roleGuests = new \Phalcon\Acl\Role("Guests");

// Add "Guests" role to acl
$acl->addRole($roleGuests);

// Add "Designers" role to acl without a Phalcon\Acl\Role
$acl->addRole("Designers");

Seperti yang Anda lihat, role dapat didefinisikan secara langsung tanpa menggunakan sebuah instance.

Menambahkan Resource

Resource adalah obyek di mana hak-akses-nya dikendalikan. Biasanya dalam aplikasi MVC resource mengacu pada controller. Meskipun hal ini tidak baku, kelas Phalcon \ Acl \ Resource  dapat digunakan dalam menentukan resource. Sangat penting untuk menambahkan action atau operasi yang berhubungan dengan resource sehingga ACL dapat memahami apa yang seharusnya untuk dikontrol.

<?php

// Define the "Customers" resource
$customersResource = new \Phalcon\Acl\Resource("Customers");

// Add "customers" resource with a couple of operations
$acl->addResource($customersResource, "search");
$acl->addResource($customersResource, array("create", "update"));

Mendefinisikan Kontrol Akses 

Sekarang kita sudah memiliki role dan resource. Sudah waktunya untuk menentukan ACL, yaitu suatu role dapat mengakses resource apa saja. Bagian ini sangat penting terutama dengan pertimbangan tingkat akses standar “allow” (membolehkan) atau “deny” (menolak).

<?php

// Set access level for roles into resources
$acl->allow("Guests", "Customers", "search");
$acl->allow("Guests", "Customers", "create");
$acl->deny("Guests", "Customers", "update");

Metode allow() menunjuk peran tertentu telah diberikan akses ke resource tertentu. Metode deny() melakukan sebaliknya.

Query ACL 

Setelah daftar telah sepenuhnya didefinisikan. Kita dapat melakukan query untuk memeriksa apakah role memiliki izin atau tidak.

<?php

// Check whether role has access to the operations
$acl->isAllowed("Guests", "Customers", "edit");   //Returns 0
$acl->isAllowed("Guests", "Customers", "search"); //Returns 1
$acl->isAllowed("Guests", "Customers", "create"); //Returns 1

Role Warisan 

Anda dapat membangun struktur role yg kompleks menggunakan pewarisan yang disediakan Phalcon \ Acl \ Role. Role dapat mewarisi dari role lainnya, sehingga memungkinkan akses ke bagian superset atau subset dari resource. Untuk menggunakan pewarisan role, Anda harus memberikan role yg diwariskan sebagai parameter kedua pada pemanggilan fungsi, saat menambahkan role dalam daftar.

<?php

// Create some roles
$roleAdmins = new \Phalcon\Acl\Role("Administrators", "Super-User role");
$roleGuests = new \Phalcon\Acl\Role("Guests");

// Add "Guests" role to acl
$acl->addRole($roleGuests);

// Add "Administrators" role inheriting from "Guests" its accesses
$acl->addRole($roleAdmins, $roleGuests);

Serialisasi daftar ACL 

Untuk meningkatkan kinerja, instance Phalcon \ Acl dapat diserialisasi dan disimpan pada APC, session, file teks atau tabel database sehingga dapat dimuat kapan saja tanpa harus mendefinisikan kembali seluruh daftar. Anda dapat melakukannya sebagai berikut:

<?php

//Check whether acl data already exist
if (!is_file("app/security/acl.data")) {

    $acl = new \Phalcon\Acl\Adapter\Memory();

    //... Define roles, resources, access, etc

    // Store serialized list into plain file
    file_put_contents("app/security/acl.data", serialize($acl));

} else {

     //Restore acl object from serialized file
     $acl = unserialize(file_get_contents("app/security/acl.data"));
}

// Use acl list as needed
if ($acl->isAllowed("Guests", "Customers", "edit")) {
    echo "Access granted!";
} else {
    echo "Access denied :(";
}

Event ACL 

Phalcon \ Acl mampu mengirim event ke EventsManager, jika ada. Event yang dipicu menggunakan jenis “acl”. Beberapa event ketika mengembalikan boolean FALSE bisa menghentikan operasi yg sedang aktif. Event berikut ini yg didukung:

Nama Acara Dipicu Bisa menghentikan operasi?
beforeCheckAccess Dipicu sebelum memeriksa jika role / resource memiliki akses Ya
afterCheckAccess Dipicu setelah memeriksa jika role / resource memiliki akses Tidak

Contoh berikut menunjukkan bagaimana untuk melampirkan listener untuk komponen ini:

<?php

//Create an event manager
$eventsManager = new Phalcon\Events\Manager();

//Attach a listener for type "acl"
$eventsManager->attach("acl", function($event, $acl) {
    if ($event->getType() == "beforeCheckAccess") {
         echo   $acl->getActiveRole(),
                $acl->getActiveResource(),
                $acl->getActiveAccess();
    }
});

$acl = new \Phalcon\Acl\Adapter\Memory();

//Setup the $acl
//...

//Bind the eventsManager to the acl component
$acl->setEventsManager($eventManagers);

Menerapkan adapter Anda sendiri 

antarmuka Phalcon \ Acl \ AdapterInterface  harus diimplementasikan untuk menciptakan adapter ACL anda sendiri atau extend yang sudah ada.

Terjemahan dr Access Control Lists Phalcon
http://docs.phalconphp.com/en/latest/reference/acl.html