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 dùng
1. soát Ability
Quyền của người dùng ngày nay có thể được rà soát bằng cách dùng can? và cannot?.
<% class="hljs-keyword" span="" style="color: rgb(198, 120, 221); box-sizing: inherit;">if can? :update, @article %>
<%= class="hljs-string" link_to="" span="" style="color: rgb(152, 195, 121); box-sizing: inherit;">"Edit", edit_article_path(@article) %>
<% class="hljs-keyword" span="" style="color: rgb(198, 120, 221); box-sizing: inherit;">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 hết thảy 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ư :createvà :update.
Đối với hành động :update, cancan sẽ chuẩn xác và phân quyền tài nguyên nhưng không đổi thay 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
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ó trong ApplicationController.
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
5. Lock It Down
Nếu bạn muốn bảo đảm authorization xảy ra trên mọi hành động trong vận dụng của bạn, hãy thêm check_authorization vào ApplicationController của bạn.
class ApplicationController < ActionController::Base
check_authorization
end
trái lại nếu muốn bỏ qua điều trên thì sử dụng skip_authorization_check.
0 comments:
Post a Comment