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