如何在RoR中限制用户访问页面?

时间:2010-01-23 09:27:33

标签: ruby-on-rails ruby authentication

我知道用户登录后我可以进行会话。另外,我创建了一个名为“current_user”的辅助方法。我不希望其他未登录的人可以访问该页面。除了做这个,我该怎么办?

我可以这样做,不允许人们访问内容,但我不希望登录中的用户也看到空白页面。

<% if current_user%>
My Content
<% end %>

3 个答案:

答案 0 :(得分:7)

创建一个检查current_user变量是否已设置的before_filter,如果不是,则将用户重定向到其他位置(root,注册页面等)。像这样:

class ApplicationController < ActionController::Base
  def login_required
    redirect_to('/') if current_user.blank?
  end
end

class MyController < ApplicationController
  before_filter :login_required, :only => :action_aviable_only_for_logged_in

  def action_aviable_only_for_logged_in
    ...
  end
end

答案 1 :(得分:1)

身份验证是一个微妙的领域,它是开发人员不断重新发明轮子的方面之一。我建议您使用现成的库或插件来执行此操作。特别推荐使用Authlogic插件。

它可以作为插件使用,因此您的应用中不会生成任何代码或侵入性内容。

在回答您的问题时,访问限制验证应该通过使用before_filter进入控制器,并检查它们将要执行的操作是否允许。 (过滤方法传递给控制器​​实例,因此被授予访问控制器所有方面的权限,并可以在它认为合适的情况下操纵它们)

但是,使用我上面提到的插件,这就像

一样简单
before_filter :require_user, :except => [:list]

除了列表操作

之外,这将需要登录控制器中的所有操作

答案 2 :(得分:0)

我认为如果访问控制是唯一正在处理的问题,那么before_filter是可行的方法。我不认为authlogic真的可以帮助你。但Ryan Bates还有其他访问控制宝石,如cancan,它看起来重量轻,而且非常易于使用。然后是declarative authorization。但是,如果你有一个大型应用程序,我认为before_filters可以让你获得更大的控制权。您可能有单独的模块,为每个实用程序提供访问控制。