レールの動的tdaに基づく役割
-
07-07-2019 - |
質問
かに構築することが可能となるクリーン構築することが可能となる役割/authorisatonベtda?
私のモデルのスキーマ、 user
いであ(admin-定義において果たす役割など、管理者は、地域ゼネラルマネージャー、販売アシスタント:
例 与えられたユーザー所長の役割への参加地域るよう、できるクエリか他のユーザーは彼女が。g:
regional_manager_for_region_a.users
=> [...] # Array of users joined to region a
regional_manager_for_region_b.users(:all, conditions => { :active => true })
=> [...] # Array of active users joined to region b
administrator.users
=> [...] # Array of all users in system
感謝、感謝のお役に立てるよう!
解決
と思います一部の認可機構でサブジェクト.
最高の逸品を知っていたことが declarative_authorization.私は個人的には使用で生産環境で、満足しています。あ railscast 約することもできます。
するのではとの考え方がありまを宣言する特定のファイルconfig/authorization_rules.rb
の役割や権限".というようなもの"マネージャで読み取りのみをお客様が"または"管理者での読み書きすべての利用者"といいますこのケースではこのようになります:
authorization do
role :guest do
# actions here can be done by everyone, even not logged in people
end
role :user do
includes :guest
# actions here can be done by logged people
end
role :manager do
includes :user #managers do everything users do, plus:
has_permission_on :sales_region, :to => :read do
if_attribute :id => is_in {user.sales_region_ids}
end
has_permission_on :users, :to => [:update, :read] do
if_attribute :id => is {user.user_ids_by_sales_region} #defined on the model
end
end
role :admin do
includes :user
has_permission_on [:sales_regions, :users], :to :manage
end
end
privileges do
privilege :manage do
includes :create, :read, :update, :delete
end
end
この指定は、修正モデルにその利用 declarative_authorization
.もう定義する user_ids_by_sales_region
方法
class User < ActiveRecord::Base
using_access_control # this enables DA
def users_by_sales_region
sales_regions.collect{ |sr| sr.users }.flatten.uniq
end
def user_ids_by_sales_region
users_by_sales_region.collect{ |u| u.id }
end
end
きを持っている必要がありま current_user
方法は、多種多様なレストランがたくさんの現在のユーザーの役割はます。のを提供するプラグインの要件"を readme.
そしてまいりたいと with_permissions_to
:
manager = User.find(...)
manager.users.with_permissions_to(:read) # the users from his region
manager.users.with_permissions_to(:read).find(:all, conditions => { :active => true })
manager.users.with_permissions_to(:write) #returns no users, managers can't edit them
admin = User.find(...)
admin.users.with_permissions_to(:write) #will return all users
この少しの努力、最初は簡単に申請きます。また、追加機能などの隠れてい/映部品の景色によってアクセス権は、現在のユーザとして含有することを特徴とするものとして禁止特定のコントローラー行動します。
まで十分に作動するのでpaginations。
この宣言的承認という宝石 cancan.なっていること、場合にはよりライアンベイツが必要です(たん railscast います。しかし、とは思わないのでできるモデルの拡張子は、どのように必要なのです。
他のヒント
私の答え以下で簡単にtda;しかし、使われることはない柔軟な対応を will_paginate
引き出しおよび設定ができますなんだろうけど、日本人の方を綺麗に範囲のユーザー @current_user
です。
感謝
だけで答えを自分の問題は、をオーバーのデフォルト協会の拡張子は以下のとおり。なにかご意見や代替案は、ちょっと素敵でした。
class User < ActiveRecord::Base
has_many :users do
def find(*args)
scope = args.first || :all
options = args.extract_options!
return User.find(args.first, options) if proxy_owner.admin?
users = []
proxy_owner.sales_regions.collect do |sales_region|
users += sales_region.users
end
users.uniq
end
end
end
だけでしたの私のコメントegarciaの答えで、最終的に決済宣言 named_scopes
に制限されます。例えば:
# app/models/account.rb
class Account < ActiveRecord::Base
named_scope :visible_to, lambda { |user|
return {} if user.can_see_all_accounts?
{ :conditions => ['sales_area_id IN (?)', user.sales_area_ids] }
}
end
# app/controllers/accounts_controller.rb
class AccountsController < ApplicationController
def index
@accounts = Account.visible_to(@current_user)
...
end
end