我正在嘗試“擴展” Rolify 功能以具有一些全域角色,例如“管理員”、“成員”、“訪客”等……并能夠為每個具有特定權限的用戶設定不同的“范圍”角色。
例如,在我的應用程式中,我有這個admin角色,這是一個“超級角色”,意味著它基本上可以訪問所有內容。但我也希望能夠為另一個用戶“限定”這個角色,范圍將是,例如“他將有權訪問所有用戶,但前提是他們來自 A、B、C 國家和 X 城市, Y,Z'。我知道 rolify 支持具有不同范圍的不同角色,但我想要的是僅為不同用戶管理具有不同范圍的“全域角色”。
我想過做一個屬于角色和用戶的“范圍”模型,在其中我將與國家和城市建立 HABTM 關系,然后將其用于授權(我正在使用 CanCanCan)。但是我在研究這種方法時遇到了很多問題。它是這樣的:
class Scope
belongs_to :user
belongs_to :role
has_and_belongs_to_many :countries
has_and_belongs_to_many :cities
end
我遇到的一個問題是我需要在創建范圍的同時授予角色,如果用戶被“撤銷”角色,則屬于用戶和角色的范圍需要是被摧毀。最后一部分我發現特別難,因為“范圍”與“用戶角色”表無關。
有人對解決此問題的更好方法有任何想法嗎?我很難找出正確的方法來擁有一個為每個用戶提供自定義范圍的角色(基本上我需要在用戶中間的東西和角色來定義用戶對該角色的范圍)。
感謝我能得到的任何幫助!
uj5u.com熱心網友回復:
如果您想創建自己的東西has_and_belongs_to_many不是答案(提示:它幾乎永遠不是正確的答案)。使用HABTM 是 Rolify 的致命弱點,因為它的關聯如下所示:
class User
has_and_belongs_to_many :roles
end
class Role
has_and_belongs_to_many :users
belongs_to :resource,
polymorphic: true,
optional: true
end
這不允許您直接查詢 users_roles 表或添加其他列或邏輯。自 2013 年以來,修復它一直是一個懸而未決的問題。有一些解決方法,但 Rolify 可能不是適合這里作業的工具。
如果你想自己動手,你想用它has_many through:來設定一個實際的連接模型,這樣你就可以直接查詢連接表并向它添加關聯、附加列和邏輯。
class User
has_many :user_roles
has_many :roles, through: :user_roles
end
class UserRole
belongs_to :user
belongs_to :role
belongs_to :resource,
polymorphic: true,
optional: true
validates_uniqueness_of :user_id,
scope: [:role_id, :resource_id, :resource_type]
end
class Role
validates :name, presence: true,
uniqueness: true
has_many :user_roles
has_many :roles, through: :user_roles
end
這會將資源范圍從每個角色轉移到每個用戶。
雖然您可以在表和“范圍”資源之間添加額外的連接表,但user_roles它并不是嚴格必要的,除非您想避免多型關聯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429660.html
