Как заставить сеансы Authlogic работать на всех поддоменах - PullRequest
3 голосов
/ 30 июня 2010

Когда пользователь заходит на мой сайт по адресу example.com, я хочу, чтобы он входил в систему при посещении something.example.com.Как я могу сделать это?(Я использую поддомен-фу, если это уместно)

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Ну, вы можете просто добавить следующие строки в / etc / hosts после "127.0.0.1 localhost"

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 или то же самое, но с суб-доменом для локального доступа к вашему приложению.

[обновить]. К сожалению, это был ответ Горацию Лоебу

1 голос
/ 15 ноября 2012

Для 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

, недостаточно - оно не удаляет файл cookie user_credentials, установленный для домена без подстановочных знаков yourdomain.com по умолчанию.Таким образом, вы должны добавить 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 в действии destroy, пользователи также не могут выйти из системы, и его следует удалить.У кого-нибудь есть решение для этого?

Обновление.Наконец, я пришел к этому - я добавил логический флаг в модель User с помощью миграции:

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

и изменил действие уничтожения следующим образом:

def destroy
  current_user_session.destroy
  if !current_user.relogined
    current_user.relogined = true
    current_user.save
    cookies.delete(:user_credentials)
  end
  session = nil
  flash[:notice] = "You have been logged out"
  redirect_to root_path
end

Теперь все работает, как ожидалось, хотяэто не очень красивое решение.Я буду рад, если кто-нибудь предоставит что-нибудь умнее.

0 голосов
/ 01 июля 2010

Исправление заключается в том, чтобы добавить это к 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, но с

...