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

时间:2011-01-06 06:53:00

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我为Devise用户和管理员设置了单独的模型。我也在使用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!)时,它失败了。 p>

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

  • Ruby 1.9.2
  • Rails 3.0.3
  • Devise 1.1.3

3 个答案:

答案 0 :(得分:14)

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

#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!这是默认行为。

答案 1 :(得分: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

请记住,使用第二种解决方案,你会说这样的话: '你必须登录,至少是用户' 你将失去对用户的身份验证。

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

答案 2 :(得分:1)

也许你应该考虑额外的宝石 - CanCan来处理角色

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