如何使Authlogic会话适用于所有子域

时间:2010-06-29 21:02:01

标签: subdomain authlogic

当用户在example.com登录我的网站时,我希望他在访问something.example.com时登录。我怎么能做到这一点? (如果相关,我正在使用subdomain-fu)

3 个答案:

答案 0 :(得分:2)

嗯,你可以在“127.0.0.1 localhost”之后在/ etc / hosts中添加以下行

127.0.0.1 localhost.com
127.0.0.1 sub.localhost.com

然后编辑您的environment / development.rb并添加

config.action_controller.session = { :domain => '.localhost.com' }

从现在起,使用http://localhost.com:3000或相同但使用子域在本地访问您的应用。

[更新]哎呀,这是Horace Loeb的答案

答案 1 :(得分:1)

对于Rails3,上面的代码将引发NoMethodError

undefined method `session=' for ActionController::Base:Class

因此,对于Rails3,您不应该更改环境配置,但应将app/config/initializers/session_store.rb设置为:

YourAppName::Application.config.session_store :active_record_store,
    {:key => '_your_namespace_session', :domain => '.yourdomain.com'}

更改初始化程序后,您还需要重新启动网络服务器才能应用初始化程序。

请注意,在代码更新之前登录的用户之后将无法注销,因为默认的注销操作看起来像是:

destroy
  current_user_session.destroy
  flash[:notice] = "You have been logged out"
  redirect_to root_path
end

是不够的 - 默认情况下,它不会删除非通配符域user_credentials的{​​{1}} cookie集。所以你应该将yourdomain.com添加到destroy动作中,所以它看起来像这样:

cookies.delete :user_credentials

这很奇怪,但是在销毁用户会话之后应该添加它,尽管此时destroy current_user_session.destroy cookies.delete :user_credentials flash[:notice] = "You have been logged out" redirect_to root_path end 。此外,还有一个问题是,在用户注销后,cookies[:user_credentials].is_nil? == true操作中的cookies.delete :user_credentials登录也会导致用户无法注销,应将其删除。有人有解决方案吗?

更新。最后我想到了 - 我通过迁移向User模型添加了一个布尔标志:

destroy

以这种方式改变了破坏行动:

class AddReloginedToUsers < ActiveRecord::Migration
  def change
    add_column :users, :relogined, :boolean, :default => false
  end
end

现在一切都按预期工作,虽然这不是一个非常漂亮的解决方案。如果有人提供更聪明的东西,我会很高兴的。

答案 2 :(得分:0)

修复方法是将其添加到production.rb

if config.action_controller.session
  config.action_controller.session[:domain] = '.your-site.com'
else
  config.action_controller.session = { :domain => '.your-site.com' }
end

我仍然无法使用localhost:3000开发它,但无论如何