ฉันใช้รูปแบบดังต่อไปนี้ เป็นมูลค่าที่จะกล่าวว่าการตรวจสอบสิทธิ์ของผู้ใช้ส่วนใหญ่สามารถแบ่งออกเป็นสองกรณีทั่วไป:
- ผู้ใช้เข้าถึงการกระทำของตัวควบคุมตามบทบาทของผู้ใช้โดยไม่ตรวจสอบการกระทำของพารามิเตอร์ที่ถูกเรียกด้วย
- การเข้าถึงของผู้ใช้กับโมเดลโดยอิงตามตรรกะหรือความสัมพันธ์ระหว่างผู้ใช้และโมเดลเฉพาะ
การเข้าถึงการกระทำของคอนโทรลเลอร์โดยไม่ตรวจสอบคุณสมบัติมักใช้ในกรอบงาน MVC สิ่งนี้ง่ายมาก: คุณกำหนดกฎผู้ใช้ของคุณมีบทบาท คุณเพียงตรวจสอบว่าผู้ใช้ได้รับอนุญาตให้ดำเนินการค้นหาบทบาทในกฎ
การเข้าถึงของผู้ใช้ไปยังรุ่นเฉพาะควรกำหนดไว้ในแบบจำลอง (นักแสดงเป็นคลาสผู้ใช้พื้นฐานสมมติว่าอาจเป็นลูกค้าผู้ขายหรือแขก)
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.
}
}
การวางตรรกะนั้นไว้ในแบบจำลองจะก่อให้เกิดกำไร วิธีการตรวจสอบการเข้าถึงสามารถสืบทอดคุณไม่จำเป็นต้องสร้างชั้นเรียนพิเศษใด ๆ คุณสามารถใช้ประโยชน์จาก OOP ทั่วไป
ต่อไปเพื่อลดความซับซ้อนของการตรวจสอบการเข้าถึงเราใช้สมมติฐานบางอย่างที่เกือบจะนำมาใช้แล้วสำหรับความเรียบง่ายและสไตล์ที่ดี:
- โดยปกติแล้วคอนโทรลเลอร์จะเกี่ยวข้องกับคลาสโมเดลบางตัว
- การกระทำที่มีการตรวจสอบสำหรับการเข้าถึงใช้รหัสรุ่นเดียวเป็นพารามิเตอร์
- พารามิเตอร์นี้สามารถเข้าถึงได้อย่างสม่ำเสมอจากวิธีการของคลาสคอนโทรลเลอร์ฐาน;
- การกระทำจะถูกวางไว้ในตัวควบคุมที่สอดคล้องกับรูปแบบที่การกระทำ id
ด้วยสมมติฐานเหล่านี้การกระทำที่ใช้รหัสประจำรุ่นสามารถเชื่อมโยงกับอินสแตนซ์ของโมเดลเฉพาะได้ ในความเป็นจริงการกระทำส่วนใหญ่สามารถเปลี่ยนและย้ายได้อย่างง่ายดายเพื่อให้เหมาะสมกับสมมติฐานที่กล่าวข้างต้น
จากนั้นคลาสคอนโทรลเลอร์นามธรรมบางคลาสควรถูกกำหนดและสืบทอด
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);
}
}
คุณสามารถเรียกใช้ SomeController :: checkModelAccess ($ id) วิธีการเมื่อคุณสร้างเมนูของคุณและตัดสินใจว่าจะแสดงลิงค์