Xác thực người dùng với component Auth
CakePHP xây dựng cho chúng ta một component có tên là Auth. Component này giúp chúng ta xác thực người dùng, cho phép/không cho phép truy xuất vào một action nào đó, ngoài ra còn nhiều tính năng khác đang chờ bạn khám phá.
Bài viết này sẽ hướng dẫn các bạn làm trang login và lấy thông tin người dùng đăng nhập hệ thống
Đầu tiên bạn chạy câu sql sau để tạo bảng users và đưa vào 1 người dùng mặc định là admin
-- -- Table structure for table `users` -- CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `passwd` varchar(50) NOT NULL, `name` varchar(200) NOT NULL, `is_actived` tinyint(1) NOT NULL, `last_login` datetime NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; -- -- Dumping data for table `users` -- INSERT INTO `users` (`id`, `username`, `passwd`, `name`, `is_actived`, `last_login`, `created`, `modified`) VALUES (1, 'admin', '0a2384f52c1c40cec196a5e05210a628ca540613', 'Nguyễn Duy Tuyên', 1, '0000-00-00 00:00:00', '2010-08-11 13:51:30', '2010-08-11 13:51:34'); |
1. Trong app_controller.php:
1.1. Bạn khai báo thêm component Auth
var $components = array('Auth'); |
1.2. Tạo hàm để thiết lập các thông số cho Auth
function __handleAuthentication() { $this->Auth->fields = array('username' => 'username', 'password' => 'passwd'); $this->Auth->userScope = array('User.is_actived' => 1); $this->Auth->authorize = 'controller'; $this->Auth->loginAction = '/users/admin_login'; $this->Auth->loginRedirect = '/admin/home'; $this->Auth->loginError = 'Thông tin đăng nhập không đúng'; $this->Auth->authError = 'Truy cập bị từ chối'; if (substr($this->action, 0, 6) == 'admin_' && !$this->Auth->user()) { $this->Auth->deny($this->action); } else { $this->Auth->allow($this->action); } } |
Giải thích:
- $this->Auth->fields: khai báo field dùng làm username và password, chỉ khai báo khi bạn tạo csdl mà không có field username, password. Trong ví dụ này tôi tạo cột lưu trữ mật khẩu là passwd thay vì password nên tôi phải khai báo lại cho Auth biết vì mặc định nó sẽ hiểu là password
- $this->Auth->userScope: khai báo thêm điều kiện để xác thực user. Ở đây, tôi muốn rằng chỉ user nào có is_actived = 1 thì mới được login
- $this->Auth->loginAction: khai báo đường dẫn tới trang login, khi user truy xuất vào action bị cấm thì sẽ redirect về đường dẫn này
- $this->Auth->loginRedirect: đường dẫn mà sau khi login thành công, Auth sẽ chuyển người dùng tới
- $this->Auth->loginError: câu thông báo khi đăng nhập sai
- $this->Auth->authError: câu thông báo khi vào một khu vực bị cấm
Đoạn code tiếp theo trong hàm trên có ý nghĩa: chỉ khi nào người dùng truy xuất vào khu vực admin mà chưa login thì sẽ bị cấm, ngược lại thì được phép:
if (substr($this->action, 0, 6) == 'admin_' && !$this->Auth->user()) { $this->Auth->deny($this->action); } else { $this->Auth->allow($this->action); } |
1.3. Gắn việc xác thực vào beforeFilter
function beforeFilter() { $this->__handleAuthentication(); } |
2. Trong users_controller.php
2.1. Hàm login
function admin_login() { if(!empty($this->data)) { $this->{$this->uses[0]}->set($this->data); $this->{$this->uses[0]}->validates(); } } |
Bạn có thể code như trên để validate dữ liệu nhập vào hoặc không cần code gì trong hàm admin_login cả, Auth tự làm giúp bạn!
2.2. Hàm logout
function logout() { $this->Auth->logout(); $this->redirect('/users/admin_login', null, true); } |
3. Lấy thông tin user đã đăng nhập
- Lấy toàn bộ thông tin user:
$session->read('Auth.User') |
- Lấy một thông tin nào đó của user (ví dụ lấy tên)
$session->read('Auth.User.name') |
Bạn xem thêm: http://book.cakephp.org/view/1250/Authentication
4. Mã hoá mật khẩu
- Auth sử dụng chuỗi trong core.php để tiến hành mã hoá mật khẩu
- Để biết một chuỗi sẽ được Auth mã hoá ra sao bạn dùng:
$this->Auth->password('chuỗi'); |
7 Comments to “Xác thực người dùng với component Auth”
Post comment
Bài viết mới
- CakePHP version 1.3.12
- Tạo chuỗi ngẫu nhiên với 1 dòng code
- Kỹ thuật “bit field” trong phân quyền
- Làm việc với File và Folder
- CakePHP 1.3.8
- CakePHP 1.3.7 Released
- Ajax trong CakePHP
- Tạo và load file config trong CakePHP
- Làm site đa ngôn ngữ với CakePHP (Phần 1)
- CakePHP 1.3.6 and 1.2.9 released
- CakePHP 1.3.5 released
- Type hinting trong PHP
- CakePHP ra phiên bản mới 1.3.4
- Tích hợp Zend framework vào CakePHP
- Tạo virtual host trên local
- Sử dụng Acl trong cakephp – Phần 2
- Sử dụng Acl trong cakephp – Phần 1
- Sinh code tự động với cake console
- Tự động xóa record ở bảng con khi reocord ở bảng cha bị xóa
- Xác thực người dùng với component Auth
Thảo luận mới
- admin on Cách viết plugin cho CakePHP
- vinh on Xác thực người dùng với component Auth
- vinh on Sử dụng Acl trong cakephp – Phần 1
- hoaipt on Cách viết plugin cho CakePHP
- tuyền on Kỹ thuật “bit field” trong phân quyền
- admin on Tạo danh mục đa cấp với behavior Tree
- admin on Làm việc với File và Folder
- admin on Sinh code tự động với cake console
- admin on Kỹ thuật “bit field” trong phân quyền
- phùng ngọc lan on Tạo danh mục đa cấp với behavior Tree
TAG
Calendar
Lưu trữ
- September 2011 (3)
- July 2011 (1)
- March 2011 (1)
- February 2011 (1)
- November 2010 (4)
- October 2010 (1)
- September 2010 (2)
- August 2010 (9)
- July 2010 (9)
- June 2010 (22)
Blogroll
- Bakery
- Biển đảo Việt Nam
- CakePHP
- CakePHP Google Group
- CakePHP Manual
- CakePHP Questions
- Diễn đàn CakePHP VN

admin

Chào anh,
Em cũng khai báo Auth tương tự như anh, khác ở chỗ em dùng action login thay vì khai báo admin_login nhưng khi đăng nhập nó cứ báo là không đăng nhập được, mặc dù em đã gõ đúng username và password. Mong anh giúp đỡ !
Ảnh
http://cB2.upanh.com/19.0.24240341.wkX0/1.png
Login sai có khả năng user mà bạn thêm vào db có password không đúng với cách mã hóa của Auth, bạn xem mục 4 trên bài viết để biết cách lấy thông tin mã hóa của 1 chuỗi bằng Auth rồi update chuỗi này vào trường password của bảng users
mình muốn kiểm tra xem một kiểm tra xem một người dùng đã đăng nhập hay chưa, nếu đã đăng nhập thì hiện ra một form để comment bài viết, còn nếu chưa đăng nhập thì không hiện ra form. Mình phải làm thế nào, mong các pro giúp đỡ, mình xin cảm ơn trước ^-^
Bạn có thể làm như bài viết mình đã hướng dẫn, kiểm tra đã login chưa thì có nhiều cách, có thể dùng: $session->read(‘Auth.User’) để lấy thông tin User từ Session rồi coi thử cái ID của user có >0
Chao anh
em chi moi hoc nen khong ro lam em lam hoai ma chang duoc gi het.
anh co the chi can ke tu dau toi duoi khong ah.
tuc la tat ca cac buoc va nhung cau lenh do duoc dat o dau trong file nao
va cai fom dang nhap, funston login, logout noi chung la moi thu co duoc khong ah, hoac anh gui file hoan thanh rui qua mail cung duoc ah.
em xin chan thanh cam on anh va moi nguoi chuc
Chuc anh that nhieu suc khoe
Trong bài hướng dẫn mình có ghi rõ là code để ở file nào mà bạn, còn function thì cứ việc copy bỏ vào thôi!
Mếu cho thêm 1 trường level nữa thì sao
nếu level =1 thì nó vào trang quản lý còn lại nó vào trang khác, vậy làm cách nào bạn