【发布时间】:2010-01-23 09:27:33
【问题描述】:
我知道我可以在用户登录后进行会话。另外,我创建了一个名为“current_user”的辅助方法。我不希望其他未登录的人可以访问该页面。除了做这个,我还能怎么做?
我可以这样做以不允许人们访问内容,但我不希望登录中的用户也看到空白页面。
<% if current_user%>
My Content
<% end %>
【问题讨论】:
标签: ruby-on-rails ruby authentication
我知道我可以在用户登录后进行会话。另外,我创建了一个名为“current_user”的辅助方法。我不希望其他未登录的人可以访问该页面。除了做这个,我还能怎么做?
我可以这样做以不允许人们访问内容,但我不希望登录中的用户也看到空白页面。
<% if current_user%>
My Content
<% end %>
【问题讨论】:
标签: ruby-on-rails ruby authentication
制作一个 before_filter 来检查 current_user 变量是否已设置,如果未设置,则将用户重定向到其他地方(根目录、注册页面等)。像这样的:
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
【讨论】:
身份验证是一个微妙的领域,它是开发人员不断重新发明轮子的方面之一。我建议您使用现成的库或插件来执行此操作。我特别推荐使用Authlogic 插件。
它作为插件工作,因此不会生成代码或侵入性内容进入您的应用程序。
在回答您的问题时,访问限制验证应该在控制器中进行,通过使用 before_filter 并检查他们将要执行的操作是否被允许。 (过滤器方法被传递给控制器实例,因此被授予对控制器所有方面的访问权限,并且可以在它认为合适的时候对其进行操作)
但是,使用我上面提到的插件,这将很简单
before_filter :require_user, :except => [:list]
这将需要登录控制器中除列表操作之外的所有操作
【讨论】:
如果访问控制是唯一要处理的问题,我认为 before_filter 是可行的方法。我不认为 authlogic 真的可以帮助你。但是还有其他访问控制 gem,例如 Ryan Bates 的 cancan,它看起来很轻,而且很容易使用。然后是declarative authorization。但是,如果您有一个大型应用程序,我认为 before_filters 可以为您提供更大的控制权。您可能有单独的模块为每个实用程序提供访问控制。
【讨论】: