2011-01-06 54 views
4

我有设计用户和管理员的单独模型。我也使用Basecamp风格的子域名。除了一些控制器和操作,我需要能够以用户身份或管理员身份进行身份验证之外,一切运行良好。设计与用户或管理模型和Basecamp样式子域名登录

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

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

我已经尝试了几件事情无济于事。看来,如果我移动authenticate_user!和authenticate_admin!成某种子域检测逻辑,它无法处理。基本上是:

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

我,在一个点上,能够得到它试图认证,但由于某种原因,它无法从需要这导致重定向循环(先为我的认证,除了会话控制器红宝石!)。

我意识到,我可以一个字段添加到我的用户是管理员指地位,但应用程序需要用户和管理员之间的权力比更大的分离将允许,除了少数控制器和动作。

  • 的Ruby 1.9.2
  • 的Rails 3.0.3
  • 设计1.1.3

回答

13

尝试编写自己的过滤器之前沿着吨他的

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

线,然后在你想同时管理员和用户能够拥有通过认证使用

#myobject_controller.rb 
before_filter :authenticate_any! 

如果您已经登录作为一个管理员权限的控制,那么你将通过before_filter,否则你将通过authenticate_user!这是默认行为。

10

其实这不起作用:

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

将开始验证用户无限递归..

,而不是尝试这个办法:

def authenticate_user! 
    return if admin_signed_in? 
    super 
end 

只要记住,这个第二解决方案您是这样说的: '您必须至少以用户' 登录,并且您将失去认证仅限用户使用。

管理员将能够访问所有。