Friday, December 22, 2017

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 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;">&quot;Edit&quot;, 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.

Đào tạo lập trình PHP

0 comments:

Post a Comment