0

Gem the_role 2.5.4

I. Giới thiệu

the_role là gem để phân quyền người dùng trong Ruby on Rails như các gem cancan, pundit... và có hỗ trợ giao diện quản trị.

II. Install

Thêm vào Gemfile

gem "the_role", "~> 2.5.4"

gem 'bootstrap-sass', github: 'thomas-mcdonald/bootstrap-sass'

Sau đó chạy:

$ bundle

** Thêm role_id: integer vào bảng User**

def self.up
  create_table :users do |t|
    t.string :login
    t.string :email
    t.string :crypted_password
    t.string :salt

TheRole field

	t.integer :role_id

	t.timestamps
  end
end

Thêm module TheRole::User vào User model

app/models/user.rb

class User < ActiveRecord::Base
  include TheRole::User

or following alias for AR

has_role

has_many :pages

end

Tạo Role model

$ bundle exec rails g the_role install

**Sẽ sinh ra file **

app/model/role.rb

class Role < ActiveRecord::Base
  include TheRole::Role

or following alias for AR

acts_as_role

end

Sau đó chạy:

$ rake the_role_engine:install:migrations
$ rake db:migrate

Tạo admin role

$ bundle exec rails g the_role admin

rồi vào rails console phân cho 1 user làm Admin

>> User.first.update(role: Role.with_name(:admin))

Thêm TheRole::Controller vào ApplicationController

app/controller/application_controller.rb

class ApplicationController < ActionController::Base
  include TheRole::Controller
  protect_from_forgery
  def access_denied
    flash[:error] = t('the_role.access_denied')
    redirect_to(:back)
  end
end

Config routes

config/routes.rb

  concern :the_role, TheRole::AdminRoutes.new

  namespace :admin do
    concerns :the_role
  end

Tạo the_role config

$ bundle exec rails g the_role config

config/initializers/the_role.rb

TheRole.configure do |config|
  config.layout                = :application
  config.default_user_role     = :user
  config.access_denied_method  = :access_denied      # define it in ApplicationController
  config.login_required_method = :authenticate_user! # devise auth method

config.first_user_should_be_admin = false

config.destroy_strategy = :restrict_with_exception # can be nil

end

Sử dụng trong controller

app/controllers/pages_controller.rb

class PagesController < ApplicationController
  before_action :login_required, except: [:index, :show]
  before_action :role_required,  except: [:index, :show]

  before_action :set_page,       only: [:edit, :update, :destroy]
  before_action :owner_required, only: [:edit, :update, :destroy]

  def edit

ONLY OWNER CAN EDIT THIS PAGE

  end

  private

  def set_page
    @page = Page.find params[:id]

TheRole: You should define OWNER CHECK OBJECT

When editable object was found

You should define @owner_check_object before invoking owner_required method

    @owner_check_object = @page
  end
end

III. Cái khái niệm trong role

role = {
  'pages' => {
    'index'   => true,
    'show'    => true,
    'new'     => false,
    'edit'    => false,
    'update'  => false,
    'destroy' => false
  },
  'articles' => {
    'index'  => true,
    'show'   => true
  },
  'twitter'  => {
    'button' => true,
    'follow' => false
  }
}

Nó gồm có sections và rules. Tương ứng với controller names và action names.

@user.has_role?(:pages, :show)

Tuy nhiên bạn cũng có thể tùy chỉnh chúng cho phù hợp yêu cầu:

@user.has_role?(:twitter, :button)
@user.has_role?(:facebook, :like)

Bạn có thể sử dụng chúng tốt hơn với các rules khác nhau Ví dụ trong views:

<% if @user.has_role?(:twitter, :button) %>
  Twitter Button is Here
<% else %>
  Nothing here :(
<% end %>

Administrator là ai?

Administrator là user có mọi quyền với mọi sections và mọi rules. Administrator là chủ của mọi đối tượng Administrator là user có section là system và rule là administrator trong role-hash.

admin_role_fragment = {
  :system => {
    :administrator => true
  }
}

Moderator là ai?

Moderator là user có quyền với những action nhất định của những section nhất định khi được phân quyền. Moderator chỉ là chủ của những đối tượng mà mình được phân quyền. Moderator có section là Moderator

admin_role_fragment = {
  :system => {
    :administrator => true
  }
}

Owner là ai?

Administrator là chủ của mọi đối tượng Moderator là chủ của những đối tượng được phân quyền User chỉ là chủ cuổi đối tượng đó thi Object.user_id == User.id

IV. API

User

User's role

@user.role # => Role obj

Kiểm tra user có phải Administrator? Hay không

@user.admin?                       => true | false

Kiểm tra user có phải Moderrator của section hay không?

@user.moderator?(:pages)           => true | false
@user.moderator?(:blogs)           => true | false
@user.moderator?(:articles)        => true | false

Kiểm tra xem User có quyền với rule của section hay không?

@user.has_role?(:pages,    :show)  => true | false
@user.has_role?(:blogs,    :new)   => true | false
@user.has_role?(:articles, :edit)  => true | false

return true if one of roles is true

@user.any_role?(pages: :show, posts: :show) => true | false

Kiểm tra xem User có phải là Owner của object hay không?

@user.owner?(@page)                => true | false
@user.owner?(@blog)                => true | false
@user.owner?(@article)             => true | false

Role

Tìm kiếm role bằng tên

@role = Role.with_name :user

Kiểm tra role

@role.has?(:pages, :show)       => true | false
@role.moderator?(:pages)        => true | false
@role.admin?                    => true | false

return true if one of roles is true

@role.any?(pages: :show, posts: :show) => true | false

Tạo role

Create a section of rules

@role.create_section(:pages)

Create rule in section (false value by default)

@role.create_rule(:pages, :index)

Đọc role

@role.to_hash => Hash

JSON string

@role.to_json => String

check method

@role.has_section?(:pages) => true | false

Cập nhật role

set this rule on

@role.rule_on(:pages, :index)

set this rule off

@role.rule_off(:pages, :index)

new_role_hash = {
  :pages => {
    :index => true,
    :show => true
  }
}
@role.update_role(new_role_hash)

Xóa role

delete a section

@role.delete_section(:pages)

delete a rule in section

@role.delete_rule(:pages, :show)

V. Hình ảnh giao diện quản lý role

gui.png

VI. Ưu, nhược điểm

Ưu điểm: tiện lợi, dễ sử dụng, giao diện trực quan. Thêm, sửa xáo role đơn giản.

Nhược điểm: Chỉ hỗ trợ cho model User, không hỗ trợ cho các model khác: Admin, Member… Nếu muốn dùng thì phải custom trong gem.

Tài liệu tham khảo: https://www.omniref.com/ruby/gems/the_role/2.5.4


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí