Tôi đã dựa trên đơn đăng ký của mình trên Khung công tác Zend. Tôi đang sử dụng Zend_Auth
để xác thực, nhưng tôi không chắc chắn nếu Zend_Acl
sẽ làm việc cho tôi bởi vì, thẳng thắn, các ví dụ tôi đã nhìn thấy hoặc là quá đơn giản cho nhu cầu của tôi hoặc gây nhầm lẫn cho tôi.Zend ACL có phù hợp với nhu cầu của tôi không?
Tôi đang nghĩ đến các yếu tố trong ứng dụng của mình là Tài nguyên và các Tài nguyên này có thể có các Đặc quyền. Các vai trò có chứa Đặc quyền tài nguyên được định nghĩa động được chỉ định cho người dùng. Tôi đang lưu trữ thông tin này trong các bảng được chuẩn hóa.
- Người dùng có một vai trò
- Một Vai trò có thể có nhiều tài nguyên
- Tài nguyên có thể có nhiều quyền ưu đãi
Vai trò thực sự chỉ là tập hợp của các đặc quyền tài nguyên không có hệ thống cấp bậc. Ví dụ về Tài nguyên sẽ là 'Trang'. Mọi người đều có thể xem các trang, nhưng người dùng được xác thực sẽ cần các đặc quyền 'thêm', 'chỉnh sửa' hoặc 'xóa' để làm bất kỳ điều gì khác với các trang.
Lưới này có Zend ACL không? Tôi có nghĩ ACL theo cách sẽ tạo ra vấn đề cho tôi không?
My Giải pháp
Typeonerror nhận được tín dụng, nhưng đây là giải pháp cụ thể của tôi.
tôi mở rộng Zend_Acl
để đơn giản hóa việc sử dụng của tôi bởi vì tôi chỉ tải về vai trò của người sử dụng hiện tại:
class My_Acl extends Zend_Acl
{
protected $_role_id;
public function setRole($role_id)
{
$this->_role_id = $role_id;
return $this->addRole($role_id);
}
public function getRole()
{
return $this->_role_id;
}
public function deny($resource, $privilege)
{
return parent::deny($this->_role_id, $resource, $privilege);
}
public function allow($resource, $privilege)
{
return parent::allow($this->_role_id, $resource, $privilege);
}
public function isAllowed($resource, $privilege)
{
return parent::isAllowed($this->_role_id, $resource, $privilege);
}
}
Để cư ACL tôi thực hiện một truy vấn mà trả resource
, privilege
, và role_id
cột. Cột role_id
không có trong tập kết quả nếu vai trò của người dùng không có đặc quyền đó.
$acl = new My_Acl();
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$userInfo = $auth->getStorage()->read();
$acl->setRole($userInfo->role_id);
} else {
$acl->setRole('');
}
// QUERY HERE
foreach ($privileges as $privilege) {
if (!$acl->has($privilege['resource'])) {
$acl->addResource($privilege['resource']);
}
if (is_null($privilege['role_id'])) {
$acl->deny($privilege['resource'], $privilege['privilege']);
} else {
$acl->allow($privilege['resource'], $privilege['privilege']);
}
}
Tôi đang thấy cấp Người dùng, Vai trò và Tài nguyên trong ví dụ của bạn. Tôi có User, Role, Resource, Privilege. Người dùng có một vai trò, một vai trò có thể có nhiều tài nguyên và một tài nguyên có thể có nhiều đặc quyền. Tôi có hiểu nhầm điều gì đó trong giải pháp của bạn không? – Sonny
Âm thanh về quyền. Cách người dùng được thiết lập, mỗi người dùng thừa kế các đặc quyền từ cha mẹ của nó.Vì vậy, "quản trị" nhận được tất cả các đặc quyền "khách" và "thành viên". Dưới quyền quản trị, tôi cho phép "tất cả" và sau đó từ chối hành động "thanh trừng" trên tất cả các tài nguyên và từ chối hành động "tạo" chỉ dựa trên "cms: comments". Vì vậy, họ vẫn có thể truy cập các hành động "cms: comments-> view" hoặc "cms: comments-> average". – typeoneerror
Đã thêm một số mã. – typeoneerror