2013-04-22 2 views
1

Как вы можете адаптировать стандартное приложение Authlogic, чтобы каждый раз вместо домашней страницы он направлял пользователя к любой ссылке, к которой они пытались добраться?Authlogic - вернуть пользователя на нужную страницу после входа в систему

Пример 1 - стандартный журнал в работах, как и ожидалось

User goes to app.com 
Goes through 'login' process 
Redirected to home_url 

Пример 2 - пользователь пытается посетить конкретную страницу

User goes to app.com/specific_link 
Redirected to login_url for authentication 
Expects to be sent back to /special_link; instead sent to home_url 

Как я могу вернуть пользователю ссылку они хотят в примере 2?

ответ

1

Сохраните страницу при входе в систему, а затем используйте ее, чтобы вернуть пользователя на эту страницу после входа в систему, например.

# redirect to the login page. Call this in the login action, when successful. 
def redirect_away(*params) 
    session[:original_uri] = request.request_uri 
    redirect_to(*params) 
end 

# returns to the original url from a redirect_away or to a default url 
def redirect_back(*params) 
    uri = session[:original_uri] 
    session[:original_uri] = nil 
    if uri 
    redirect_to uri 
    else 
    redirect_to(*params) 
    end 
end 
+0

Я только что понял, что у меня отсутствует вторая часть этого кода в моем user_sessions_controller. Спасибо, Майкл. – sscirrus

0

Я думаю, request.referer хранит эту информацию для вас. Таким образом, вы проверяете наличие этого атрибута на объекте request, и если он существует, вы перенаправляете его, а не home_url.

if request.referer 
    redirect_to request.referer 
else 
    redirect_to home_url 
end 

Нечто подобное.

+0

Будьте осторожны при использовании реферера. Представьте, что пользователь перенаправляется на страницу входа.Если им нужно сделать несколько попыток ввода пароля, вы потеряете исходный реферер. – Aupajo

1

Michael был близок, но метода request_uri для объекта запроса нет.

Murifox также был близок, но #referrer не дает вам необходимую информацию. Вы, наверное, хотите #url.

Попробуйте это (принимает на себя «заверенного» возвращает ваш авторизован):

before_filter :check_authentication 
. 
. 
. 
private 

def check_authentication 
    unless authenticated 
    session[:intented_page] = request.url 
    redirect_to login_page 
    end 
end 

Затем в контроллер, который обрабатывает логины, после успешного входа в вас просто сделать:

redirect_to session[:intended_page] 

Кстати : метод #referrer изначально был неправильно указан как #referer. Теперь есть псевдоним, поэтому оба написания работают, но «referrer» является правильным в соответствии со словарем.

(Отредактировано позже): На самом деле #referrer может быть тем, что вы хотите. Если вы входите в контроллер для целевого URL-адреса, когда вы проверяете свою аутентификацию (как в коде здесь), вы хотите #url. Если вы находитесь в контроллере, где вы перенаправили с целевым контроллером, тогда вы хотите #referrer.

0

Хотя вышеприведенные рекомендации будут работать, использование сеанса не является наилучшим вариантом. Размер файла cookie составляет 4 096 байт. Это немного, и если ваше смешивание может быть довольно длинным URL-адресом, это может привести к сбою вашего хранилища сеансов.

Вместо этого вы должны использовать метод cookies. Это создаст отдельный незашифрованный (по умолчанию) файл cookie, который сохранит ваши данные сеанса отдельно.

cookies[:original_uri] = { value: request.request_uri, expires: 10.minutes.from_now } 

Затем прочитать куки вы используете

cookies[:original_uri]