路径安全和before_filters rails

时间:2012-07-10 07:20:15

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

我目前正在创建一个用户可以创建和申请职位的应用。然而,由于我对rails很新,我面临着一个相当重要的安全功能,如果任何用户知道正确的路径,例如:

 localhost:3000/users/user_id/apps

然后他们可以看到任何用户为任何工作做出的任何申请!

我很确定我需要使用before_filter检查current_user.id是否匹配每个作业的jobs表中找到的user_id,或者匹配我的应用程序表中找到的user_id。

我真的不确定如何构建它或应用过滤器的位置 - 例如,最好在应用程序控制器中创建过滤器,然后在需要时应用skip_before_filter实例。

人们可以提供有关构建此代码以及放置位置的任何帮助,我们将不胜感激!谢谢:)

2 个答案:

答案 0 :(得分:1)

在开始研究cancan之类的授权解决方案之前,一个简单的方法是避免执行

App.find params[:id]

由于某个应用与用户相关联,并且您已经设置了current_user,因此可以执行

app = current_user.apps.find params[:id]

无论要查找哪些参数,都只会找到与用户关联的应用。

cancan真正发挥作用的地方在于你需要一个更复杂的人可以做什么系统。例如,用户可能能够编辑他们创建的任何作业,但可以查看(而不是编辑)另一组作业。

例如

can :manage, Project, :user.id  => user.id
can :read, Project, :department => user.department 

这将允许用户完全访问他们的任何项目并读取他们部门中项目的访问权

关于cancan的另一个问题是,不是在控制器周围散布before_filters或宏,而是在一个地方声明规则,因此通常更容易看到正在发生的事情。有关cancan wiki和railscast的更多信息。

答案 1 :(得分:0)

你是对的before_filter可能是一个解决方案,但它不是最先进的解决方案。这是一个轨道广播,......

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

当您使用cancan而不是设计时,您需要创建应返回当前登录用户的User对象的current_user助手...