2012-09-13 85 views
0

幫我解決這個問題:的Rails的before_filter

我有兩個色器件模型(用戶和管理員)

和我有一些崗位模型和控制器的路線:

/posts 
/posts/80 
/posts/80/edit 

,我想即: 管理員擁有所有訪問 用戶可以訪問:

/post 
    and 
/post/80 (if he is creator of this post) 

我做到了這一點:

class PostsController < ApplicationController 
     before_filter :check_guest_logged_in!, :except => [:index, :show] 

. 
. 
. 
    private 

    def check_guest_logged_in! 
     if user_signed_in? 
     authenticate_user! 

     elsif admin_signed_in? 
     authenticate_admin! 
     else 
     redirect_to root_path 
     end 
    end 

但在這種情況下,如果用戶是授權他可以把瀏覽器

/posts/80/edit 

,他獲得的訪問(即使他不是這個職位的創造者)

我怎樣才能解決這一問題?

我想類似的東西 私人

def check_guest_logged_in! 
     if user_signed_in? 
     authenticate_user! 

    if (current_user.id == @post.user.id) 
    else 
     return false; 
    end  

     elsif admin_signed_in? 
     authenticate_admin! 
     else 
     redirect_to root_path 
     end 
    end 

,但它不是工作

回答

3

我的建議是使用康康舞寶石

https://github.com/ryanb/cancan

這裏有一個很好的railscast上它

http://railscasts.com/episodes/192-authorization-with-cancan

隨着康康舞,你可以做這樣的事情

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.admin? 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 
end 
+0

用了可以可以,我可以這樣做呢? –

+1

與您的代碼最根本的問題是,你如果用戶登錄只檢查,而不是他們是否是這一職位的所有者。你會在你的職位表中需要一個ACCOUNT_ID列,你可以簡單地做一個過濾器前,並檢查CURRENT_USER相同的職位所有者,但康康舞確實是一個更好的選擇,因爲它很容易配置,並保持你的代碼DRY –

相關問題