12/08/2018, 11:47

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

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

  private

  def set_page
    @page = Page.find params[:id]
    @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.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
@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

@role = Role.with_name :user

Kiểm tra role

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

Tạo role

@role.create_section(:pages)
@role.create_rule(:pages, :index)

Đọc role

@role.to_hash => Hash
@role.to_json => String
@role.has_section?(:pages) => true | false

Cập nhật role

@role.rule_on(:pages, :index)
@role.rule_off(:pages, :index)

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

Xóa role

@role.delete_section(:pages)
@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.

0