質問

かに構築することが可能となるクリーン構築することが可能となる役割/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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top