Zend_Acl có tác dụng phân quyền cho người dùng. Ví dụ như user
không được vào trang quản trị, thành viên mới có thể download, đủ điểm
mới có thể mua hàng...
I. Lý thuyết
1. khởi tạo đối tượng
2. Khái niệm Resource và Role
Resource: chính là các module, controller mà chúng ta muốn phân quyền.
Role: chúng là các cấp độ người dùng (user, member, moderator, admin...).
3. Thêm Resource và Role vào Zend_Acl
4. Cấp quyền
- Cho phép vào
- Không cho phép
Cú pháp chung của quyền allow và deny như sau:
Nếu như một trong 3 tham số chúng ta để null thì nghĩa là toàn bộ đối tượng của nhóm đó.
Ví dụ:
5. Kiểm tra không được phép thì chuyển về Not Permission:
Chỉ những Role được Allow thì mới được phép vào, ngược lại tất cả sẽ chuyển về action not premission. Do vậy mình không cần phải deny vì mình chỉ kiểm tra không allow thôi.
II. Phân quyền cho Controller Index trong Module Admin
Bước 1: Tạo form đăng nhập
Vào thư mục forms của module Default tạo một file login.php với nội dung
Bước 2: Trong Controller Index của Module Default tạo một loginAction() và một welcomeAction()
- loginAction() : dùng để thực hiện chức năng đăng nhập và chứng thực thông tin người dùng
- welcomeAction() : hiển thị thông báo chào và list các đường link tới các action trong Controller Index của Module Admin nếu đăng nhập thành công.
1. loginAction()
View của loginAction
2. welcomeAction()
View của welcomeAction
Bước 3: Phân quyền cho Controller Index của Module Admin
Đầu tiên ta viết hàm preDispatch() để chuyển hướng người dùng nếu chưa đăng nhập và chứng thực
Tiếp theo ta viết các action index, insert, delete, update
Ta sẽ viết phân quyền cho người dùng trong function init()
Cuối cùng ta viết errorAction để thông báo không được quyền truy cập
1. khởi tạo đối tượng
$acl = new Zend_Acl();
2. Khái niệm Resource và Role
Resource: chính là các module, controller mà chúng ta muốn phân quyền.
Role: chúng là các cấp độ người dùng (user, member, moderator, admin...).
3. Thêm Resource và Role vào Zend_Acl
$acl->addRole(new Zend_Acl_Role('user')); $acl->addResource(new Zend_Acl_Resource('index'));
4. Cấp quyền
- Cho phép vào
$acl->allow( role , resource , action );Ví dụ:
$acl->allow('user','index','index'); // Cho phép user vào action index của controller index
- Không cho phép
$acl->deny( role, resource , action);Ví dụ
$acl->deny('user','index','delete'); // Không cho phép user vào action delete của controller index
Cú pháp chung của quyền allow và deny như sau:
allow/deny(role, resource, action);
Nếu như một trong 3 tham số chúng ta để null thì nghĩa là toàn bộ đối tượng của nhóm đó.
Ví dụ:
$acl->allow(null,'index','index'); // Tất cả các Role đều được vào index action của index controller $acl->allow('admin',null,'index'); // admin có thể vào action index của tất cả các controller $acl->allow('moderator','admin:index',array('index','insert','update')); // Moderator chỉ có thể vào index action, insert action, update action của controller index trong module admin
5. Kiểm tra không được phép thì chuyển về Not Permission:
$module = $this->_request->getModuleName();
$controller = $this->_request->getControllerName();
$action = $this->_request->getActionName();
$resource = $module.":".$controller;
if( !$acl->isAllowed($role,$resource,$action) )
{
$this->_redirect(HOST_PATH.'/index/notpermission');
}
Chỉ những Role được Allow thì mới được phép vào, ngược lại tất cả sẽ chuyển về action not premission. Do vậy mình không cần phải deny vì mình chỉ kiểm tra không allow thôi.
II. Phân quyền cho Controller Index trong Module Admin
Bước 1: Tạo form đăng nhập
Vào thư mục forms của module Default tạo một file login.php với nội dung
<?php class Default_Form_Login extends Zend_Form { public function init() { //Username $this->addElement('text','username',array( 'label'=>'Username', 'size'=>21, )); $username = $this->getElement('username'); //Validate //NotEmpty $username->setRequired(true) ->addValidator('NotEmpty',true) ->getValidator('NotEmpty')->setMessage('Username không được bỏ trống.'); //Khong co dau, khoảng trắng và các kí tự đặc biệt $username->addValidator('Regex',true,array('/^[a-zA-Z0-9]*$/')) ->getValidator('Regex')->setMessage('Username không hợp lệ.'); //vì là Login nên để không hợp lệ //Filter $username->addFilter('Stringtrim') ->addFilter('StringToLower'); //End Username //Password $this->addElement('password','password',array( 'label'=>'Password', 'size'=>21 )); $password=$this->getElement('password'); //Validate //NotEmpty $password->setRequired(true) ->addValidator('NotEmpty') ->getValidator('NotEmpty')->setMessage('Password không được bỏ trống'); //Khong co dau, khoảng trắng và các kí tự đặc biệt $password->addValidator('Regex',true,array('/^[a-zA-Z0-9]*$/')) ->getValidator('Regex')->setMessage('Password không hợp lệ.'); //Filter $password->addFilter('StringTrim') ->addFilter('StringToLower'); //End password //Submit $this->addElement('submit','login',array('label'=>'Login')); //End Submit } }
Bước 2: Trong Controller Index của Module Default tạo một loginAction() và một welcomeAction()
- loginAction() : dùng để thực hiện chức năng đăng nhập và chứng thực thông tin người dùng
- welcomeAction() : hiển thị thông báo chào và list các đường link tới các action trong Controller Index của Module Admin nếu đăng nhập thành công.
1. loginAction()
//LoginAction public function loginAction() { $mod=$this->_request->getModuleName(); $formLogin= new Default_Form_Login(array('name'=>'formLogin','id'=>'formLogin','action'=>'','method'=>'post')); // nếu có submit if($this->_request->getPost('login') ) { if($formLogin->isValid($this->_request->getPost())) { // Một khi vào tới đây thì username và password không được trống $arrayData=$formLogin->getValues();// Lấy giá trị từ form // Chứng thực với Zend_Auth // 1. Khởi tạo đối tượng và chỉ ra tên bảng chứa thông tin chứng thực $authTable = new Zend_Auth_Adapter_Dbtable(); $authTable->setTableName('thanhvien') // Tên bảng để chứng thực ->setIdentityColumn('username') // Tên cột nhận dạng ->setCredentialColumn('password'); // Tên cột nhận dạng bí mật // 2. Lấy dữ liệu từ form và đưa vào identity và credential $authTable->setIdentity($arrayData['username']) ->setCredential($arrayData['password']); // 3. Truy vấn cơ sở dữ liệu $authTable->getDbSelect()->where('Actived = 1'); // 4. Khởi tạo chứng thực và lấy kết quả chứng thực $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authTable); // 5. Kiểm tra chứng thực thành công hay thất bại và xử lý if($result->isValid()) { // Lấy tất cả các dữ liệu trừ cột password $getInfo = $authTable->getResultRowObject(null,array('password')); // Ghi dữ liệu đã chứng thực vào session $auth->getStorage()->write($getInfo); $this->_redirect(HOST_PATH.'/'.$mod.'/index/welcome'); }else{ $this->_redirect(HOST_PATH.'/'.$mod.'/index/login'); } //End chứng thực với Zend_Auth }// end validate form }//end submit $this->view->formLogin=$formLogin; }//end function loginAction() //End Login Action
View của loginAction
<?php echo $this->formLogin; ?>
2. welcomeAction()
public function welcomeAction() { $mod=$this->_request->getModuleName(); $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $userInfo = $auth->getIdentity(); $this->view->username = $userInfo->username; }else{ $this->_redirect(HOST_PATH.'/'.$mod.'/index/login'); } }
View của welcomeAction
<?php echo 'Hello '.$this->username.'!'; ?> <br/> <a href="<?php echo HOST_PATH ?>/admin/index/index">M-Admin C-Index A-Index</a><br/> <a href="<?php echo HOST_PATH ?>/admin/index/insert"> M-Admin C-Index A-Insret</a></br> <a href="<?php echo HOST_PATH ?>/admin/index/update">M-Admin C-Index A-Update</a></br> <a href="<?php echo HOST_PATH ?>/admin/index/delete">M-Admin C-Index A-Delete</a></br>
Bước 3: Phân quyền cho Controller Index của Module Admin
Đầu tiên ta viết hàm preDispatch() để chuyển hướng người dùng nếu chưa đăng nhập và chứng thực
public function preDispatch() { $auth = Zend_Auth::getInstance(); if( !$auth->hasIdentity() ) { $this->_redirect(HOST_PATH.'/default/index/login'); } }
Tiếp theo ta viết các action index, insert, delete, update
public function indexAction() { echo "Module Admin - Controller Index - Action Index"; $this->getHelper('ViewRenderer')->setNoRender(); } public function insertAction() { echo "Module Admin , Controller Index, Insert Action "; $this->getHelper('ViewRenderer')->setNoRender(); } public function updateAction() { echo "Module Admin , Controller Index, Update Action "; $this->getHelper('ViewRenderer')->setNoRender(); } public function deleteAction() { echo "Module Admin , Controller Index, Delete Action "; $this->getHelper('ViewRenderer')->setNoRender(); }
Ta sẽ viết phân quyền cho người dùng trong function init()
// Phân quyền người dùng // 1. Kiểm tra chứng thực $auth = Zend_Auth::getInstance(); if( $auth->hasIdentity() ) { // Chứng thực thành công // 2. Khởi tạo đối tượng Zend_Acl $acl = new Zend_Acl(); // 3. Lấy thông tin để phân quyền từ Zend_Auth $infoUserData = $auth->getIdentity(); // Lấy cấp độ người dùng $level = $infoUserData->level; // 4. Tạo Roles $role=""; switch($level) { case 1: $role = "admin"; break; case 2: $role = "moderator"; break; case 3: $role = "member"; break; default : $role = "member"; } // 5. Add Roles $acl->addRole(new Zend_Acl_Role('member')) ->addRole(new Zend_Acl_Role('moderator')) ->addRole(new Zend_Acl_Role('admin')); // 6. Add Resource Module Admin- Controller Index $acl->addResource(new Zend_Acl_Resource('admin:index')); // 7. Phân quyền // Member chỉ được vào action index $acl->allow('member','admin:index','index'); // Moderator vào được index, insert, update action. $acl->allow('moderator','admin:index',array('index','insert','update')); // Admin vào được tât cả các action. $acl->allow('admin','admin:index',null); // Các role đều vào được action error $acl->allow(null,'admin:index','error'); // 8. Lấy module, controller, action $module = $this->_request->getModuleName(); $controller = $this->_request->getControllerName(); $action =$this->_request->getActionName(); $resource=$module.":".$controller; // 9. Chuyển hướng sang error nếu không được phép. if( !$acl->isAllowed($role,$resource,$action) ) { $this->_redirect(HOST_PATH.'/admin/index/error'); } } // End Phân quyền người dùng
Cuối cùng ta viết errorAction để thông báo không được quyền truy cập
public function errorAction() { echo "You don't have permission to access this action"; $this->getHelper('ViewRenderer')->setNoRender(); }
Nguồn: Sưu tầm Internet
Cho mình hỏi chút function init() nằm trong controller admin hay ở đâu vậy bạn? Mình thấy bài viết rất hay muốn áp dụng nhưng chưa hiểu rõ cấu trúc. rất mong được sự giúp đỡ của bạn. Thanks :)
Trả lờiXóa