2011-02-11 20 views
1

我正在處理角色/權限設置,但似乎無法按預期工作。Rails用戶 - >角色 - >權限設置

class User < ActiveRecord::Base 

    has_and_belongs_to_many :roles, :join_table => "users_roles" 
    has_many :permissions, :through => :roles 


class Role < ActiveRecord::Base 

    has_and_belongs_to_many :users 
    has_and_belongs_to_many :permissions, :join_table => "roles_permissions" 


class Permission < ActiveRecord::Base 

    has_and_belongs_to_many :roles 

我想什麼是能夠直接從我的用戶對象(user.roles,user.permissions)訪問角色和權限。

user.roles正在工作,但我似乎無法獲得user.permissions工作。有沒有人可以幫助我?

另一種方法是使用像Devise + CanCan這樣的插件。然而,我對使用插件作爲認證和授權至關重要的事情有一些擔憂 - 如果它們停止使用會發生什麼?任何對此有看法的人?

謝謝!

+2

我會和CanCan一起去的。它是開源的,即使瑞恩貝茨停止了它的工作,其他人(也許你)可以也可能會這樣做。它確實是你想要的而沒有麻煩。 – polarblau 2011-02-11 15:07:41

回答

0

我想你會更好使用慘慘實現與角色等

認證,但如果你仍然想從用戶模型訪問「權限」,我猜你可以在用戶模式做這樣的:

def permissions 
    Permission.find(:all, :joins => {:roles => :users}, :conditions => ["users.id = ?", self.id]) 
    end 

雖然沒有經過測試。

您應該檢查this了。

1

CanCan針對授權。 Authlogic和Devise用於認證。授權和身份驗證是Web應用程序的兩個不同但通常相關的方面。

我有一種感覺,你不能使用has_many :through來引用has_and_belongs_to_many關聯。我認爲has_many :through必須引用has_many關聯。雖然我找不到任何明確的信息。也許別人知道?

我從來沒有推出自己的認證,因爲Devise和Authlogic都很好地完成了這項工作,並且很容易擴展(尤其是設計)。安全散列的最佳實踐是內置的。 OpenID和Facebook身份驗證是簡單的附加組件。爲什麼重新發明輪子?最糟糕的情況是,他們將來會不受支持。對我來說這沒什麼大不了的,因爲我仍然有源代碼,所以我沒有任何東西可以放鬆,一切都可以獲得。

如果您不需要您的權限請確保您的權限能夠將您的權限(也就是某些角色中的用戶可執行的操作)硬編碼到CanCan功能文件中。除非有要存儲的其他元數據,否則您可能不需要用於角色的數據庫表。我建議避免has_and_belongs_to_many關聯,因爲大多數應用程序最終都需要將其他數據與連接表相關聯。這將是一個需要考慮的解決方案。有更簡單和更復雜的方法來完成相同的事情。

class User < ActiveRecord::Base 
    has_many :roles 
end 

class RoleAssignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
end 

class Role < ActiveRecord::Base 
    has_many :role_assignements 
    has_many :users, :through => :role_assigments 
end 

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    if user.roles.include? Role.find_by_name('admin') 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 
end