Tôi sử dụng chương trình sau đây. Điều đáng nói là hầu hết các kiểm tra quyền của người dùng có thể được chia thành hai trường hợp chung:
- người dùng truy cập vào hành động của bộ điều khiển dựa trên vai trò người dùng mà không kiểm tra hành động tham số được gọi với,
- người dùng truy cập vào mô hình dựa trên bất kỳ logic hoặc mối quan hệ nào giữa người dùng cụ thể và mô hình cụ thể.
Truy cập vào hành động của bộ điều khiển mà không kiểm tra các thuộc tính thường được thực hiện trong các khung MVC. Điều này hoàn toàn đơn giản: bạn xác định quy tắc, người dùng của bạn có vai trò. Bạn chỉ cần kiểm tra xem người dùng có quyền hành động tra cứu vai trò của nó trong các quy tắc hay không.
Người dùng nên truy cập vào mô hình cụ thể trong mô hình. (Diễn viên là lớp người dùng cơ sở. Giả sử đó có thể là khách hàng, người bán hoặc khách.)
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.
}
}
Đặt logic đó trong mô hình mang lại một số lợi nhuận. Phương thức kiểm tra truy cập có thể được kế thừa, bạn không cần tạo thêm bất kỳ lớp nào, bạn có thể sử dụng các lợi thế OOP chung.
Tiếp theo, để đơn giản hóa việc kiểm tra truy cập, chúng tôi đưa ra một số giả định gần như luôn được triển khai vì đơn giản và phong cách tốt:
- bộ điều khiển thường liên quan đến một số lớp mô hình;
- các hành động được kiểm tra để truy cập lấy id mô hình duy nhất làm tham số;
- tham số này luôn có thể được truy cập thống nhất từ phương thức của lớp trình điều khiển cơ sở;
- hành động được đặt trong bộ điều khiển tương ứng với mô hình mà hành động id thực hiện.
Với các giả định này, các hành động sử dụng id mô hình có thể được liên kết với thể hiện mô hình cụ thể. Trên thực tế, hầu hết các hành động có thể dễ dàng được chuyển đổi và di chuyển để phù hợp với các giả định đã nêu ở trên.
Sau đó, một số lớp trình điều khiển trừu tượng cơ sở nên được định nghĩa và kế thừa.
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);
}
}
Bạn có thể gọi phương thức someControll :: checkModelAccess ($ id) khi bạn xây dựng các menu của mình và quyết định có hiển thị một số liên kết hay không.