Giới thiệu gem cancancan trong rails
Bài đăng này đã không được cập nhật trong 6 năm
I.Giới thiệu
Gem cancancan là gem dùng để phân quyền cho người dùng truy cập tới tài nguyên của hệ thống. Trước khi sử dụng gem cancancan
thì các bạn nhớ tìm hiểu về gem devise
trước nhé.
II. Cài đặt
gem 'cancancan', '~> 2.0'
- Không quên chạy lệnh
bundle install
- Tiếp theo ta chạy lệnh bên dưới để tạo ra file app/models/ability.rb.
rails g cancan:ability
- Ta sẽ được một model ability như thế này. Các quyền của user sẽ được định nghĩa trong model này.
class Ability
include CanCan::Ability
def initialize(user)
end
end
III. Cách sử dụng
1. Kiểm tra Ability
- Quyền của người dùng hiện tại có thể được kiểm tra bằng cách sử dụng
can?
vàcannot?
.
<% if can? :update, @article %>
<%= link_to "Edit", edit_article_path(@article) %>
<% end %>
2. Authorizations và Loaders
- Phương thức authorize! trong controller để kiểm tra quyền và trả về lỗi nếu quyền đó là không được phép hoặc chưa được khai báo.
def show
@article = Article.find(params[:id])
authorize! :read, @article
end
- phương pháp load_and_authorize_resource được cung cấp để tự động cho phép tất cả các hành động trong một RESTful nạp tài nguyên vào một biến thể và cho phép nó cho mọi hành động.
class ArticlesController < ApplicationController
load_and_authorize_resource
def show
# @article is already loaded and authorized
end
end
3. Strong Parameters
- Khi sử dụng
strong_parameters
, bạn phải dọn đầu vào trước khi lưu bản ghi, trong hành động như:create
và :update
. - Đối với hành động :
update
, cancan sẽ xác thực và phân quyền tài nguyên nhưng không thay đổi chúng tự động, giống như:
def update
if @article.update_attributes(update_params)
# hurray
else
render :edit
end
end
...
def update_params
params.require(:article).permit(:body)
end
Xem thêm tại đây
4. Handle Unauthorized Access
- Nếu
authorization
không thành công,CanCan :: AccessDenied
sẽ ném ra lỗi. Bạn có thể nắm bắt điều này và sửa đổi hành vi của nó trongApplicationController
.
class ApplicationController < ActionController::Base
rescue_from CanCan::AccessDenied do |exception|
respond_to do |format|
format.json { head :forbidden, content_type: 'text/html' }
format.html { redirect_to main_app.root_url, notice: exception.message }
format.js { head :forbidden, content_type: 'text/html' }
end
end
end
Xem thêm tại đây
5. Lock It Down
- Nếu bạn muốn đảm bảo
authorization
xảy ra trên mọi hành động trong ứng dụng của bạn, hãy thêmcheck_authorization
vàoApplicationController
của bạn.
class ApplicationController < ActionController::Base
check_authorization
end
- Ngược lại nếu muốn bỏ qua điều trên thì sử dụng
skip_authorization_check
.
Tham khảo thêm tại đây
All rights reserved