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

Phân quyền trong rails, sử dụng Gem cancancan

Phân quyền là một trong những công việc quan trọng khi xây dựng website. trang web có nhiều người dùng, nhóm người dùng khác nhau, yêu cầu giới hạn truy cập nguồn tài nguyên  cũng khác nhau. Công việc này có thể được thực thi dễ dàng bằng cách sử dụng thư viện Gem cancancan trong Ruby on Rails.Quyền của người dùng định nghĩa trong file ability.rb

Cài đặt
Thêm vào Gemfile và chạy lệnh bundle install

gem ‘cancancan’, ‘~> 1.10’

Tạo file ability.rb quản lý quyền người dùng

$ rails g cancan:ability

file ability.rb được đặt trong thư mục app/models/ , với nội dung:

Code
class Ability
    include CanCan::Ability
    user ||= User.new  # tạo người dùng mới nếu chưa đăng nhập
    if user.admin?
        can :manage, :all # người dùng là admin có quyền truy cập đến tất cả action của tất cả các Controller
    else
        can :index, :all # ngược lại,người dùng có thể truy cập đến action index tất cả Controller
        can [:index,:show], [Book,Category] #được truy cập đến action index,show của Book,Category Controller
end 
end

Sau khi định nghĩa quyền trong file ability.rb, Có thể sử dụng kiểm tra quyền trên cả controller và view, sử dụng phương thức can?, can’t?
trên view

Code
<% if can? :index, @book %>
   <% link_to “Edit”, edit_book_path(@book) %>
<% end %>

Trên 1 controller với 1 action cụ thể

Code
def show
    @book = Book.find(params[:id])
    authorize! :read,@book
end

Trên 1 controller tất cả các action sử dụng load_and_authorize_resource

Code
class BooksController < ApplicationController
load_and_authorize_resource
def
show
# @book is already loaded and authorized
end
end

Nếu muốn kiểm tra quyền trên tất cả các action trên tất cả các controller, sử dụng check_authorization trong ApplicationController

Code
class ApplicationController < ActionController::Base
check_authorization
end

điều này dẫn muốn bỏ qua kiểm tra quyền trên 1 controller con nào đó, ra sử dụng skip_authorization_check trên Controller đó
kiểm tra quyền trên controller có thể sảy ra ngoại lệ, nếu user không có quyền truy cập ngoại lệ đó

Code
class ApplicationController < ActionController::Base
    rescue_from CanCan::AccessDenied do |exception|
         redirect_to root_url, :alert => exception.message
    end
end

Đây là hướng dẫn phân quyền cơ bản sử dụng cancancan. cancancan có thể giúp bạn được nhiều hơn nữa. Xem thêm: cancancan

Sondn, 26/11/2016

Để lại phản hồi