我看過了declarative_authorization,CanCan和CanTango。他們都擅長嚮應用程序添加授權,但我想知道如何向模型的特定實例添加授權,例如,某人可以在一個項目中擁有管理權限並且只有有限的權限(讀取少於管理:限制更新等)在另一個。Rails 3.1中的授權:CanCan,CanTango,declarative_authorization?
您能否請更好的方法?道歉,如果我的問題聽起來太瑣碎。這可能是因爲我是RoR的新手。
感謝, 約翰
我看過了declarative_authorization,CanCan和CanTango。他們都擅長嚮應用程序添加授權,但我想知道如何向模型的特定實例添加授權,例如,某人可以在一個項目中擁有管理權限並且只有有限的權限(讀取少於管理:限制更新等)在另一個。Rails 3.1中的授權:CanCan,CanTango,declarative_authorization?
您能否請更好的方法?道歉,如果我的問題聽起來太瑣碎。這可能是因爲我是RoR的新手。
感謝, 約翰
據我所知康康舞和declarative_authorization,我實現了基於角色的授權雙全,我建議慘慘。只是我的兩分錢。
例(未經測試,可惜我不能在這裏測試,我有我的代碼無法訪問)
所以我們可以說,我們有這樣的結構:
class User < ActiveRecord::Base
belongs_to :role
end
class Role < ActiveRecord::Base
has_many :users
# attributes: project_read, project_create, project_update
end
然後,慘慘可以看看像這樣:
class Ability
include CanCan::Ability
def initialize(user)
@user = user
@role = user.role
# user can see a project if he has project_read => true in his role
can :read, Project if role.project_read?
# same, but with create
can :create, Project if role.project_create?
# can do everything with projects if he is an admin
can :manage, Project if user.admin?
end
end
你可以在github的CanCan維基上找到你需要的所有信息。個人推薦閱讀:
基本上你只需要擴展上面的例子中,通過你的關係,包括你的角色。爲了簡單起見,您還可以在ability.rb
中創建其他輔助方法。
你會摔跤的(至少我是這樣)的主要手段警告:請確保您的用戶可以做一些事情的模型,你定義用戶無法之前。否則,你會坐在那裏感到沮喪,並想「但爲什麼?我從來沒有寫過用戶不能。」是啊。但是,你也從來沒有明確寫道,他可以...
我已經實現了康康..但無法弄清楚如何定義/限制用戶的特定實例(說項目)。任何例如會很有幫助。 用戶和項目之間有間接連接... 1.團隊成員有很多用戶 2.團隊有很多團隊成員 3.項目有一個團隊 – 2012-01-18 08:14:14
更新了一個例子。 – pduersteler 2012-01-18 08:38:31
我是否需要安裝康康並創建角色模型?我在康康文檔中沒有看到它是需要的。你能解釋一下嗎?謝謝 – 2013-01-05 08:00:36
class User < ActiveRecord::Base
belongs_to :role
delegate :permissions, :to => :role
def method_missing(method_id, *args)
if match = matches_dynamic_role_check?(method_id)
tokenize_roles(match.captures.first).each do |check|
return true if role.name.downcase == check
end
return false
elsif match = matches_dynamic_perm_check?(method_id)
return true if permissions.find_by_name(match.captures.first)
else
super
end
end
private
def matches_dynamic_perm_check?(method_id)
/^can_([a-zA-Z]\w*)\?$/.match(method_id.to_s)
end
def matches_dynamic_role_check?(method_id)
/^is_an?_([a-zA-Z]\w*)\?$/.match(method_id.to_s)
end
def tokenize_roles(string_to_split)
string_to_split.split(/_or_/)
end
end
用法:
user.is_an? admin
user.can_delete?
在CanCan中,您可以通過具有條件的塊來定義功能 - https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks。 – 2012-01-18 06:49:09
1.團隊成員有許多用戶,角色 2.團隊有很多團隊成員 3.項目有一個團隊...... 有了塊,上面的設置不提供過濾特定項目實例的方法。如果您認爲可以做到...請給我一個例如提前致謝。 – 2012-01-18 08:22:12