2010-01-10 3 views
4

Возможно ли установить домен cookie для чего-то другого, кроме текущего домена, когда сеанс создается с помощью Authlogic?Укажите домен cookie в Authlogic Когда сеанс создан

Когда новый аккаунт создан из нашего домена SIGNUP, я хотел бы перенаправить пользователя на их подобласти учетной записи и входа пользователя в

Контроллер тока:.

def create 
    @account = Account.new(params[:account]) 
    if @account.save 
    @user_session = @account.user_sessions.create(@account.users.first) 
    # I'd like the cookie domain to be [@account.subdomain, APP_CONFIG[:domain]].join(".") 
    redirect_to admin_root_url(:host => [@account.subdomain, APP_CONFIG[:domain]].join(".")) 
    else 
    render 'new' 
    end 
end 

ответ

4

Если вы:

config.action_controller.session[:domain] = '.YOURDOMAIN.COM'

в файле production.rb, что позволит вам иметь все вошли в систему на всех поддоменов субдомена. Если вы затем добавите фильтр (или что-то еще, но я использую фильтр, чтобы я знал, что работает), который проверяет, что кто-то фактически использует правильный домен, прежде чем показывать содержимое контроллера, он работает очень хорошо.

В качестве примера вы можете сохранить соответствующий поддомен для сеанса как переменную сеанса и предоставить людям ссылки на свои настройки, если они были в вашем основном домене или смотрели страницу на чужом субдомене.

Это, по-видимому, общий шаблон для такого рода вещей - если вы настроили cookie, специфичный для поддомена, иначе вы не сможете сказать, когда они вошли на главный сайт. У меня также есть помощник «users_domain?», который заканчивается тем, что иногда я получаю вызов, когда я это делаю.

Если вы не хотите иметь такие общие шаблоны веб-дизайна, одноразовое создание сеанса wesgarrion -> создание сеанса на субдомене - также путь. Я просто подумал, что упоминаю об этом как о проблеме дизайна/взаимодействия/кода.

0

Если вы хотите чтобы зарегистрировать их на субдомене, вы можете использовать токеновый токен Authlogic.

Обратитесь к Params module за примером при входе в систему с помощью одноразового токена.

Естественно, ваше действие будет регистрировать их и создавать их сеанс (на субдомене), чтобы они не могли повторно аутентифицироваться для следующего запроса.

Там являются вариантами, чтобы установить домен для печенья в process_cgi() и session(), но я не вижу способ установить те за запрос в Authlogic. Однако список рассылки автоответчика довольно отзывчивый, и это похоже на довольно стандартный вариант использования, который кто-то попробовал бы и понял бы. И я видел вашу заметку в группе google, так что неважно.

+0

Single_access_token не предназначен для постоянных сеансов - он предназначен для одиночных запросов (получение фида, требующего аутентификации, доступа к API и т. Д.). Последующие запросы, которые не содержат ключа, не будут иметь сеанса. – bensie

+0

Да. В этом действии вы должны создать свой сеанс нового для этого субдомена. – wesgarrison

0

Если у вас есть приложение с несколькими субдоменами, и вы не хотите, чтобы файлы cookie сеансов были разделены между ними или, что еще хуже, у вас есть файл cookie верхнего домена .domain с той же session_key, плавающей рядом с файлом cookie субдомена (Rails будет держать один и бросать другой - я считаю, просто на основе порядка в заголовке запроса) - вы можете использовать крючки диспетчера, чтобы заставить cookie сеанса к поддоменам.

Включите крючок в ActionController с расширения.

base.send :after_dispatch, :force_session_cookies_to_subdomains

Установите домен это в вашей after_ отправка крюк.

@env['rack.session.options'] = @env['rack.session.options'].merge(:domain => 'my_sub_domain' end)

Для нас, мы смотрим на @env [HTTP_HOST], чтобы определить, что [my_sub_domain] должно быть.

При таком подходе пользователь должен войти в субдомен для браузера, чтобы принять cookie субдомена (если только использование шаблона, такого как Authlogic Params, не распространяется на следующий запрос в отношении поддомена).

Примечание. Браузер отклонит cookie субдомена, когда запрос поступает из домена более высокого уровня. Для нас это не плохо - это приводит к тому же результату, который нам нужен, что cookie верхнего уровня сессии не создается и затем отправляется в поддомены.

Другой подход к подобному концу может заключаться в том, чтобы заставить cookie не устанавливаться, если не из поддомена. Не тратя много времени на это, как я был в состоянии сделать это было -

request.env["rack.session"] = ActionController::Session::AbstractStore::SessionHash.new(self, request.env)

в после фильтра в ApplicationController.