Saya menggunakan skema berikut. Layak untuk dikatakan bahwa sebagian besar pemeriksaan izin pengguna dapat dibagi menjadi dua kasus umum:
- akses pengguna ke tindakan pengontrol berdasarkan peran pengguna tanpa memeriksa parameter tindakan dipanggil dengan,
- akses pengguna ke model berdasarkan pada logika atau hubungan antara pengguna tertentu dan model tertentu.
Akses ke tindakan pengontrol tanpa memeriksa atribut biasanya diimplementasikan dalam kerangka kerja MVC. Ini sederhana sekali: Anda menetapkan aturan, pengguna Anda memiliki peran. Anda cukup memeriksa bahwa pengguna memiliki izin untuk mencari perannya dalam aturan.
Akses pengguna ke model tertentu harus didefinisikan dalam model. (Aktor adalah kelas pengguna dasar. Misalkan dapat berupa pelanggan, penjual, atau tamu.)
interface ICheckAccess
{
public function checkAccess(Actor $actor, $role);
}
class SomeModel implements ICheckAccess
{
public function checkAccess(Actor $actor, $role)
{
// Your permissions logic can be as sophisticated as you want.
}
}
Menempatkan logika itu dalam model mendatangkan untung. Metode pemeriksaan akses dapat diwariskan, Anda tidak perlu membuat kelas tambahan, Anda dapat menggunakan keunggulan OOP umum.
Selanjutnya, untuk menyederhanakan pemeriksaan akses, kami mengambil beberapa asumsi yang hampir selalu diterapkan untuk kesederhanaan dan gaya yang baik:
- biasanya kontroler terkait dengan beberapa kelas model;
- tindakan yang diperiksa untuk akses mengambil id model tunggal sebagai parameter;
- parameter ini selalu dapat diakses secara seragam dari metode kelas pengendali basis;
- action ditempatkan di controller sesuai dengan model yang diambil id action.
Dengan asumsi ini, tindakan yang menggunakan id model dapat dikaitkan dengan instance model tertentu. Bahkan, sebagian besar tindakan dapat dengan mudah diubah dan dipindahkan agar sesuai dengan asumsi yang disebutkan di atas.
Kemudian, beberapa kelas pengontrol abstrak dasar harus didefinisikan dan diwarisi.
abstract class ModelController
{
// Retrieve model from database using id from action parameter.
public abstract function loadModel($id);
// Returns rules for user role to pass to SomeModel::checkAccess()
// Something like array('view' => 'viewer', 'delete' => 'owner', 'update' => 'owner')
public abstract function modelRules();
public abstract fucntion getIdParameter();
public function filterModelAccess()
{
$id = $this->getIdParameter();
if(!$this->checkModelAccess($id))
throw new HttpException(403);
}
public function checkModelAccess($id)
{
$model = $this->loadModel($id);
$actor = My::app()->getActor();
$rules = $this->modelRules();
$role = $rules[My::app()->getActionName()];
return $model->chechAccess($actor, $role);
}
}
Anda dapat memanggil metode SomeController :: checkModelAccess ($ id) ketika Anda membuat menu dan memutuskan apakah akan menampilkan beberapa tautan.