Rails控制器中的安全验证?

时间:2011-07-20 09:36:49

标签: ruby-on-rails ruby-on-rails-3

我想知道在我的控制器中是否有最好的方法来实现这种方式:

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

我在我的应用程序中有几个这样的验证,我可以清楚地看到它很容易错过一个并且可以访问你不应该访问的内容!

由于

2 个答案:

答案 0 :(得分:1)

这不是Rails方式。其中一个rails原则是对Model层进行所有对象操作。控制器主要关注整体授权/身份验证/缓存失效/ 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

答案 1 :(得分:1)

老实说,我会使用CanCan

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