Số 10, Ngõ 12, Khuất Duy Tiến, Nhân Chính, Thanh Xuân, TP Hà Nội
096 803 1388

Cách cài đặt và sử dụng Gem Cancan

I. GIỚI THIỆU

Cancan là 1 Gem  rất hữu ích để phân quyền người dùng trong ruby on rails, nó cho phép quyền hạn truy cập của user với hệ thống của bạn. Với cách dùng và định nghĩa tương đối khác đơn giản.Tất cả các quyền được quy định tại một địa điểm duy nhất (lớp Khả năng) và không bị trùng lặp trên bộ điều khiển, quan điểm, và các truy vấn cơ sở dữ liệu. Do vậy Cancan là 1 gem gần như không thể thiếu trong Projects của Developer ruby.

II. CÀI ĐẶT

Trong Rails 3, thêm vào trong  Gemfile của bạn :

gem “Cancan”

anh1

Trong Rails 2, thêm vào tập tin này environment.rb của bạn.

config.gem “Cancan”
Ngoài ra, bạn có thể cài đặt nó như là một plugin.

Rails Plugin cài đặt git: //github.com/ryanb/cancan.git

III. Định nghĩa file Abilities

File Abilities được dùng để định nghĩa quyền truy cập cho user. Sử dụng lệnh sau để tạo file Abilities:

anh2

Mặc định file ability được tạo ra sẽ có nội dung như sau:

anh3

Ta có thể hiểu đoạn code trên như sau:  Việc định nghĩa phân quyền đều được thực hiện trong initialize method. Nếu user là admin thì có quyền quản lý tất cả các model. Ngược lại không phải admin thì chỉ có quyển read – xem dữ liệu.

Can chỉ định quyền thực hiện action với 2 tham số truyền vào lần lượt là:

– Tên action

– Tên class của object

Trong ví dụ trên có 2 đối số đặc biệt được định nghĩa mặc định là:

manager : Đại diện cho tất cả các action

all : Đại diện cho tất cả các class

cannot để phủ định quyền thực hiện của 1 class. tham số truyền vào tương tự như can

Lưu ý: Với mỗi tham số trên ta có thể truyền vào 1 mảng thay vì 1 giá trị đơn thuần.

Ví dụ :

anh4

 

Như vậy định nghĩa trên cho phép user thực hiện 2 action create,destroy  trên cả 2 model là Post và Comment

File ability như trên mới là ví dụ rất cơ bản. Đối với những role khác thì sao. Chúng ta cùng xem tiếp phần dưới đây.

Đôi khi ta muốn định nghĩa các Role kế thừa action của những Role khác. Ví dụ ta có 3 role như sau:

moderator : có quyền quản lý tất cả Post (bài viết trong Forum)

admin : quản lý ForumThread(chủ đề trong Forum)

superadmin : quản lý Forum – bao gồm cả ForumThread và Post

Ta làm như sau:

anh5

Như vậy vơi cách định nghĩa trên. Quyền truy cập của Role ứng với User tăng dần. Và thằng có toàn quyền truy cập quản lý là superadmin.

(Dĩ nhiên là ngoài định nghĩa ở đây. thì các model cũng phải có cấu trúc phân tầng như vậy Forum -> ForumThread -> Post)

Kiểm tra quyền:

  • view:Cancan hỗ trợ 2 method để kiểm tra quyền là can? và cannot? trong view. Kết quả trả về là true hoặc false dựa trên định nghĩa ở file ability. 2 tham số truyền vào cũng tương tự như vậy:
    
    
    anh6
  • controller:Trong controller có 2 method để kiểm tra là authorize  và load_and_authorize_resource 
    • authorize ! Để kiểm tra quyền truy cập đơn lẻ trong từng controller nó sẽ ném ra 1 exception nếu user không có quyền thực hiện action đó:
    • anh7
    •  load_and_authorize_resource: cho phép kiểm tra quyền đối với mọi controller. Để bỏ qua việc kiểm tra này trong controller ta sử dụng skip_load_and_authorize_resource:
      
      

      anh8

Xử lý exception

Khi 1 exception được ném ra. Ta có thể chỉ định action để xử lý nó như thế nào. Và ta có thể định nghĩa nó như sau:


anh9

Ngoài ra ta có thể dùng check_authorizetion để đảm bảo rằng mọi controller đều được kiểm tra quyền truy cập:


anh10

Nếu bạn muốn đảm bảo chắc chắn việc cấp phép xẩy ra trên mọi action trong ứng dụng của bạn, hãy thêm vào check_authorizetion


anh11

Và bao giờ method cấp quyền hoặc kiểm tra toàn bộ cũng có 1 method để bỏ qua action đó và nó là skip_check_authorizetion. Ta chỉ cần thêm action này vào controller muốn bỏ qua

Lưu ý: Các method định nghĩa chung cho toàn bộ controller thường được khai báo trong   ApplicationController hoặc baseController (Những controller được áp dụng đều kế thừa từ controller này)

Trên đây là Toàn bộ bài viết giới thiệu về cách sử dụng Gem Cancan.

 

 

Luân ML

Ngày 11/26/2016

Để lại phản hồi