我已经在 Google 群组上看到过几次被问到的问题,但似乎没有人跟进答案或解决方案。. 是否可以使用中央数据库使用 Authlogic 从多个 Rails 应用程序创建用户和进行身份验证?
我现在不能选择使用 OpenID,我很愿意,但我的客户还不支持它。
我已经在 Google 群组上看到过几次被问到的问题,但似乎没有人跟进答案或解决方案。. 是否可以使用中央数据库使用 Authlogic 从多个 Rails 应用程序创建用户和进行身份验证?
我现在不能选择使用 OpenID,我很愿意,但我的客户还不支持它。
似乎仍然没有针对原始问题发布解决方案。
我有一个类似的问题。我有多个 Rails 应用程序,我需要能够在所有应用程序之间跟踪用户。因此,我希望有一个用于管理用户和跟踪的应用程序,并且所有其他应用程序都将连接到该用户数据库进行身份验证。
我已经在其他一些项目中使用 Authlogic,所以我希望它会像更改一些配置设置一样简单。
这是我的解决方案:
我创建了主要的用户跟踪应用程序。该应用程序没有什么特别之处。它允许用户注册、登录、注销等。一旦用户登录,他们就可以导航到其他应用程序。
在我的用户应用程序和每个需要使用基本应用程序进行身份验证的应用程序的 environment.rb 文件中,您需要将会话密钥和域设置为相同。
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
此 User 模型的不同之处在于它现在具有建立连接方法。“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”,就像在主用户应用程序中一样。
希望这可以帮助。
追逐 M 灰色
从设计的角度来看,您是否考虑过创建一个专门用于处理用户信息和身份验证的系统。然后让您的其他应用程序通过一个安全的 API(很可能是内部的)连接到该系统。您可以保持数据库分离,并通过仅允许通过 API 访问来保证用户数据库的安全。
简短的回答是“是的”。当然。在应用程序之间共享用户模型与在应用程序之间共享任何其他类型的模型没有根本的不同。哎呀,如果您不介意它有点慢,您甚至可以通过 REST 和 ActiveResource 提取您的用户数据。
但是,如果 Authlogic 和类似的解决方案不是锁定的业务约束,那么除了 OpenID 之外,还有其他方法可以处理 SSO(单点登录)。看看RubyCAS、Castronaut(也许用Casablanca作为客户),或者完全不同的方法Hancock。
我认为最好的方法是实现OpenID系统。
它允许您的用户不仅在您的应用程序上进行身份验证,而且几乎可以在任何地方使用他们的登录名和密码进行身份验证。
我个人不喜欢 OpenID,人们倾向于认为它比它更安全一点。
至于你的问题,我看不出有什么理由你不能这样做,你必须格外注意安全性(用户只能登录到他被允许登录的应用程序/域)。
我看到的唯一问题是您不能在应用程序之间仅共享一个表,默认情况下,您必须为所有应用程序使用相同的数据库,这是不行的。
但是,有一种方法可以将模型指向不同的数据库,我会推荐 [link text][1] gem。尽管它的用途完全不同,但您应该能够使用它将每个应用程序指向用户模型的特定不同数据库。
[1]:http: //github.com/fiveruns/data_fabric data_fabric