2011-07-20 81 views
1

我不知道是否有实现这个在我的控制器的轨道方式最好的办法:控制器中的Rails安全验证?

def show 
    @article = Article.find(params[:id]) 
    # you can only view a public article or your own articles. 
    @article = nil unless @article.public? || @article.owner?(current_user) 
end 

def edit 
    @article = Article.find(params[:id]) 
    # you can only edit your own articles 
    @article = nil unless @article.owner?(current_user) 
end 

我有一对夫妇验证这样在我的应用程序,我可以清楚地看到它很容易错过一个和给予你不应该的东西!

谢谢

回答

1

它不是Rails的方式。轨道原理之一是在模型层上采取所有对象操作。控制器主要关心整体授权/认证/缓存失效/ cookie和会话设置。

可以使用协会范围

class ArticlesControllers << ApplicationsController 

    def show 
    @article = current_user.articles.public.find(params[:id]) 
    end 

end 

class Article < ActiveRecord::Base 
    scope :public, :where('public').is('true') 

end 
+0

这不是我想要的,但那是一个开始。这是一个更好的方法,但它会让我获得我自己的和公开的文章,我的意思是要么有公开文章,要么有我自己的文章。 –

+0

也许像“Article.public.find(params [:id])|| current_user.articles.find(params [:id])”会工作吗? –

+0

你最好把它包装成模型的方法。将current_user作为参数传递并将条件表达式移入方法中 – Anatoly

1

老实说,我会使用CanCan

can :read, Article, public: true 
can :manage, Article, owner_id: user.id