Aug
12

Xác thực người dùng với component Auth

Author admin    Category Chia sẻ, Tutorial     Tags ,

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”

  • Việt 19/01/2011 at 4:04 pm

    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

  • admin 20/01/2011 at 1:48 am

    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

  • mai vien 15/02/2011 at 8:50 pm

    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 ^-^

  • admin 16/02/2011 at 11:09 pm

    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

  • babycrazy 23/03/2011 at 2:19 pm

    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

  • admin 28/03/2011 at 12:22 am

    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!

  • vinh 23/12/2011 at 9:14 pm

    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

Post comment

Follow us on Twitter! Follow us on Twitter!
Diễn đàn CakePHP cho người Việt Nam

Bài viết mới

Thảo luận mới

TAG

Calendar

August 2010
M T W T F S S
« Jul   Sep »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

Lưu trữ

Blogroll

Thống kê

Danh sách: 4 khách