Ruby on rails Rails:在视图中限制页面访问是一种好的做法吗?

Ruby on rails Rails:在视图中限制页面访问是一种好的做法吗?,ruby-on-rails,authentication,view,restriction,Ruby On Rails,Authentication,View,Restriction,我正在构建一个应用程序,人们可以在其中创建自己的页面,并通过唯一的URL访问它们。没有使用电子邮件和密码或任何类似的标准登录。 用户可以决定是否要为其页面设置密码。 如果有人想查看或编辑某个页面,如果该页面设置了密码,则应要求他输入密码。如果没有,他应该能够立即查看或编辑页面。 我想到的唯一方法是,在没有繁重的解决方法的情况下实现这一点,将访问控制权放到视图中,并通过if-then-else更改其输出 现在我想知道这是否是一种好的做法,或者它是否会导致一些严重的漏洞问题。简短的回答是:不。您不想

我正在构建一个应用程序,人们可以在其中创建自己的页面,并通过唯一的URL访问它们。没有使用电子邮件和密码或任何类似的标准登录。 用户可以决定是否要为其页面设置密码。 如果有人想查看或编辑某个页面,如果该页面设置了密码,则应要求他输入密码。如果没有,他应该能够立即查看或编辑页面。 我想到的唯一方法是,在没有繁重的解决方法的情况下实现这一点,将访问控制权放到视图中,并通过if-then-else更改其输出


现在我想知道这是否是一种好的做法,或者它是否会导致一些严重的漏洞问题。

简短的回答是:不。您不想让视图尽可能地保持逻辑清晰。更重要的是,最好使用restful设置,而不是将更多逻辑堆积到一个控制器和/或模型中。在本例中,我们讨论的是对用户进行身份验证。通常,使用before_筛选器检查用户是否登录到某个操作。因此,您可以在控制器上使用before_过滤器。使用传入的方法检查对象是否受保护。当该对象受到保护时,检查用户当前是否经过身份验证

在before筛选器中,您可以重定向到备用操作,最好是设置为使用密码表单的操作。我可能会为此创建一个单独的控制器。可以称之为会话或身份验证,如您所愿。为密码窗体设置新操作,并设置创建操作。新视图需要在某种类型的隐藏字段中包含页面id,或者可以使用嵌套资源将其保留在路由中。例如:

resources :pages do
  resource :session, :only => [:new, :create]
end
这将创建如下路由:

/pages/1/session/new
/pages/1/session (POST)

在创建操作中,您可以设置会话存储(只要密码正确)。在您的身份验证检查中,只需检查会话存储的值。

为了简单起见破坏MVC的诱人想法误导了我。谢谢你如此轻松地解决了这个问题。这很容易让你陷入诱惑。但是,如果您想进一步说明如何限制对页面的访问,该怎么办?例如,稍后使用登录id查看所有页面。那么你已经为它做了一些基础工作了。