0

我目前正在创建一个应用程序,用户可以在其中创建和申请工作。但是,由于我对 Rails 相当陌生,因此我面临着一个相当重要的安全功能,即如果任何用户知道正确的路径,例如:

 localhost:3000/users/user_id/apps

然后他们可以看到任何用户为任何工作所做的任何应用程序!

我相当确定我需要使用 abefore_filter来检查 current_user.id 是否与我的作业表中为每个作业找到的 user_id 匹配,或者与我的应用程序表中找到的 user_id 匹配。

我真的不确定如何构建它或在哪里应用过滤器 - 例如,在应用程序控制器中创建过滤器然后skip_before_filter在需要的地方应用实例是否更好。

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

4

2 回答 2

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 上也有更多信息。

于 2012-07-10T07:46:27.700 回答
0

你是对的,before_filter可能是一个解决方案,但它不是最先进的解决方案。有一个railscast,...

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

当您使用 cancan 但未设计时,您需要创建current_user应该返回当前登录用户的 User 对象的帮助程序...

于 2012-07-10T07:26:14.030 回答