使用用户或管理模型和Basecamp样式子域设计登录

我有Devise用户和管理员的单独模型。 我也在使用Basecamp风格的子域名。 一切都运行良好,除了一些控制器和操作,我需要能够以用户或管理员身份进行身份validation。

目前我有authenticate_user! 在我的application_controller.rb中设置,我正在使用skip_before_filter跳过那些只有管理员应该有权访问的控制器和操作。

不幸的是,我不能简单地在每个控制器上指定身份validation要求,因为我仍然需要一些控制器和操作才能被用户或管理员访问。

我尝试了一些无济于事的事情。 看来如果我移动authenticate_user! 和authenticate_admin! 在某种子域检测逻辑中,它无法处理。 基本上:

current_subdomain = request.subdomains.first if current_subdomain == 'admin' authenticate_admin! else authenticate_user! end 

我曾经一度能够让它尝试身份validation,但由于某种原因,除了会话控制器需要身份validation导致重定向循环(我的第一个使用Ruby!)之外,它没有成功。

我意识到我可以向我的用户添加一个表示管理员状态的字段,但除了一些控制器和操作之外,应用程序需要在用户和管理员之间实现更大的权限分离。

  • Ruby 1.9.2
  • Rails 3.0.3
  • 设计1.1.3

尝试在过滤之前编写自己的

 #application_controller.rb def authenticate_any! if admin_signed_in? true else authenticate_user! end end 

然后在控制器中,您希望管理员和用户都能够通过身份validation使用进行访问

 #myobject_controller.rb before_filter :authenticate_any! 

如果您以管理员身份登录,那么您将通过before_filter,否则您将通过authenticate_user! 这是默认行为。

实际上这不起作用:

 #application_controller.rb def authenticate_any! if admin_signed_in? true else authenticate_user! end end 

它将在validation用户时启动无限递归。

试试这个:

 def authenticate_user! return if admin_signed_in? super end 

请记住,对于第二种解决方案,您会说这样的话:“您必须至少以用户身份登录”,否则您将失去对用户的身份validation。

管理员将能够访问所有内容。

也许你应该考虑额外的gem – CanCan来处理角色

这里描述的很好: http : //www.tonyamoyal.com/2010/09/29/rails-authentication-with-devise-and-cancan-part-2-restful-resources-for-administrators/