12/08/2018, 16:36

Giới thiệu gem cancancan trong rails

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

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

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êm check_authorization vào ApplicationController 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

0