Gem the_role 2.5.4
Bài đăng này đã không được cập nhật trong 3 năm
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
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