2012-01-28 123 views
0

我想實現一個公共的api訪問控制模式是非常類似於facebooks圖形API的服務。我使用守門人gem,它允許我使用Devise進行OAuth,並且可以輕鬆授予訪問令牌的權限/範圍。如何爲Rails實現(oauth-)基於角色的訪問控制?

那麼除此之外,我需要: - 訪問控制基礎上的訪問令牌 範圍 - 平臺(如Facebook上的隱私設置),訪問控制爲不同羣體的用戶 - 訪問控制必須是動態,不能假設固定的角色

不,我看看CanCan,似乎做基於角色的訪問控制,但它似乎不很容易OAuthuth,使我問自己,它可能是最好的只是滾動出我自己的系統?那麼基本上對模型進行所有訪問控制是否正確?

你有什麼建議嗎?

+0

CanCan不能滿足您的需求嗎?我對OAuth並不熟悉,但我想不出它不起作用的原因。 – Max 2012-01-28 00:44:06

+0

據我從我的研究中看到,CanCan的範圍是非常傳統的RBAC。我想爲潛在的所有用戶進行動態範圍設定,所以我不能將它們放在組中(至少這是我對cancan的理解) – nambrot 2012-01-28 01:02:05

+0

我對「動態範圍」的含義有些不確定。 – Max 2012-01-28 01:07:49

回答

0

我想CanCan可以處理你想要的東西。既然你沒有提供關於用戶授權的細節,我會告訴你一些我認爲會有幫助的方法。我要說的第一件事就是你可以將任何你想要的對象傳遞給你的能力文件。要做到這一點,你就以下事項:

def ApplicationController < ActionController::Base 
    def current_ability 
    @current_ability = CustomAbility.new(pass, in, anything, here) 
    end 
end 

在應用程序/模型,你會當定義custom_ability.rb:

def CustomAbility 
    include CanCan::Ability 

    def initialize(anything, you, want, here) 
    ... 
    end 
end 

在這種情況下,任何=傳球,你= IN,想要什麼= ,這裏=這裏。另外,您可以調用您正在授權的資源上的某些方法。 CanCan的工作方式是加載@resource_name,然後輸入要授權的能力文件。它通過假設RESTful路由加載@resource_name,但只要將其存儲在@resource_name中(即將用戶存儲在@user中),就可以輕鬆使用before_filter加載自己的資源。

您還可以調用您正在授權已創建參數的對象上的某些方法。例如,你可能想要做這樣的事情:

def initialize(user) 
    can :read, Post do |post| 
    !((post.readable_groups & user.groups).empty?) 
    end 
end 

基本上,如果在該塊線路返回false,那麼你成爲非法。唯一需要注意的是該塊不會在創建或新建時執行。有辦法解決這個問題。例如,假設您在模型級別爲每個用戶強制執行一個帖子並進行唯一性驗證。您可以使用之前的過濾器來加載設置user_id的帖子,然後執行

can :create, Post, valid?: true 

無論如何,希望有所幫助。

+0

我想我唯一的問題是:我怎樣才能使郵政的某些屬性可見取決於我通過初始化的參數?就像我希望管理員能夠看到所有數據,但客人只能查看該帖子的摘錄,例如? – nambrot 2012-01-28 08:08:06

+0

通常,CanCan中的動作與控制器動作相對應,但我相信可以任意定義動作。舉例來說,我覺得你可以把這樣的事情:'可以:read_part,郵政#哈希或條件塊here',然後在你的看法,你可以說'<%,如果可以嗎?(:read_part,@post)%> '等等 – Max 2012-01-28 16:08:53

相關問題