使用Authlogic的多个应用程序,在一个数据库中验证用户?

时间:2009-10-27 15:24:59

标签: ruby-on-rails authlogic

我已经在Google小组上看过几次问题,但似乎没有人跟进答案或解决方案。是否可以使用中央数据库进行用户创建和使用多个Rails应用程序进行身份验证Authlogic?

我现在不能选择使用OpenID,我很乐意,但我的客户不支持尚未

5 个答案:

答案 0 :(得分:8)

似乎还没有在原始问题上发布解决方案。

我有类似的问题。我有多个rails应用程序,我需要能够在所有这些应用程序之间跟踪用户。因此,我希望有一个用于管理用户和跟踪的应用程序,所有其他应用程序将连接到此用户数据库进行身份验证。

我已经将Authlogic用于其他一些项目,所以我希望它会像更改一些配置设置一样简单。

这是我的解决方案:

我创建了主要的用户跟踪应用程序。该应用程序没有什么特别之处。它允许用户注册,登录,注销等。一旦用户登录,他们就可以导航到其他应用程序。

在我的用户应用程序的environments.rb文件和需要使用基本应用程序进行身份验证的每个应用程序中,您需要将会话密钥和域设置为SAME。

config.action_controller.session = {
  :session_key => '_my_app_session',
  :secret      => '_long_secret_session_key_here',
  :domain => ".basedomain.com" 
}

我的每个应用程序都在他们自己的子域下,例如app1.basedomain.com app2.basedomain.com 我不确定如果没有更多的改变,这是否会起作用。

在每个应用程序中,创建UserSession

class UserSession < Authlogic::Session::Base   
end

和用户模型。

class User < ActiveRecord::Base
   establish_connection "users_database"
   acts_as_authentic 
end

此用户模型的不同之处在于它现在具有建立连接方法。 “users_database”位于database.yml文件中,并指向中央用户管理应用程序的数据库。

我没有尽可能地登录并注销我的子应用程序,但如果你这样做,你也必须创建UserSessionsController。

在每个使用身份验证的应用程序中,我在ApplicationController中包含了一些辅助方法,例如

   def current_user_session
      return @current_user_session if defined?(@current_user_session)
      @current_user_session = UserSession.find
   end

   def current_user
      return @current_user if defined?(@current_user)
      @current_user = current_user_session && current_user_session.record
   end

   def require_user
     unless current_user
       store_location
       redirect_to 'http://main_user_login_page'
       return false
     end
   end

然后我可以在我的控制器中使用'require_user',我想在我的主用户应用程序中进行身份验证。

希望这会有所帮助。

Chase M Gray

答案 1 :(得分:2)

从设计的角度来看,您是否考虑过创建专用于处理用户信息和身份验证的系统。然后让您的其他应用程序通过安全API连接到该系统,很可能是内部的。您可以将数据库分开,并通过仅允许通过API进行访问来保持用户数据库的安全。

答案 2 :(得分:1)

简短的回答是“是的”。当然。在应用程序之间共享用户模型与在应用程序之间共享任何其他类型的模型没有根本区别。哎呀,如果你不介意它有点慢,你甚至可以通过REST使用ActiveResource来提取你的用户数据。

但是,如果Authlogic和类似的解决方案不是锁定的业务约束,除了OpenID之外,还有其他方法可以处理SSO(单点登录)。请查看RubyCASCastronaut(对于客户可能有Casablanca),或者使用完全不同的方法,Hancock

答案 3 :(得分:0)

我认为最好的方法是实施OpenID系统 它允许您的用户不仅可以在您的应用程序上进行身份验证,而且几乎可以通过登录名和密码进行身份验证。

答案 4 :(得分:0)

我个人不喜欢OpenID,人们倾向于认为它比它更安全。

至于你的问题,我没有看到你不能这样做的任何理由,你必须特别注意安全性(用户只能登录他允许的应用程序/域名)前)。

我看到的唯一问题是你不能只在应用程序之间共享一个表,默认情况下,你必须为所有应用程序使用相同的数据库,这是禁忌。

但是,有一种方法可以将模型指向不同的数据库,我会推荐[link text] [1] gem。虽然它用于完全不同的用途,但您应该能够使用它将每个应用程序指向用户模型的特定不同数据库。

[1]:http://github.com/fiveruns/data_fabric data_fabric