Аутентификация RESTful: попытка выполнить простое перенаправление при аутентификации на основе файлов cookie зашла в тупик.

У меня есть приложение RoR, использующее подключаемый модуль RESTful Authentication. Все отлично работает. Недавно я включил аутентификацию на основе файлов cookie, и это тоже отлично работает. Проблема в том, что я хочу изменить целевую страницу по умолчанию, когда пользователь аутентифицируется с помощью файла cookie. Я хочу, чтобы пользователь, прошедший проверку подлинности cookie, был перенаправлен на ту же страницу, на которую он перенаправляется после успешного входа в систему из формы входа. Они всегда направляются на исходный URL-адрес запроса. Я ломаю голову над этим, так как думал, что понял, как это работает, и каждое изменение, которое я делаю, кажется, не имеет никакого значения.

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


person Community    schedule 24.05.2009    source источник


Ответы (5)


Я решил проблему, но это немного уродливо, на мой взгляд. Вот что я сделал.

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

def login_from_cookie
  user = cookies[:auth_token] && User.find_by_remember_token(cookies[:auth_token])
  if user && user.remember_token?
    session[:cookie_login] = true   **# this is my addition**
    self.current_user = user
    handle_remember_cookie! false # freshen cookie token (keeping date)
    self.current_user
  end
end

Затем в :before_filter set_current_user я просто проверяю эту переменную и перенаправляю, если она установлена, убедившись, что для переменной установлено значение nil.

def set_current_user
  Authorization.current_user = current_user
  if session[:cookie_login] 
    redirect_to :controller => :users, :action => :search
    session[:cookie_login] = false
  end
end

Это некрасиво, но это работает. Я определенно открыт для любых предложений о том, как очистить это.

person Community    schedule 24.05.2009
comment
Не будет ли это перенаправление на каждый запрос? - person Steven Soroka; 07.10.2009
comment
интересная идея, но я поддерживаю вопрос Стивена - как только пользователь вошел в систему, он наверняка будет постоянно входить в систему через файл cookie (по каждому запросу), верно? значит ли это, что они постоянно перенаправляются? Вы говорите, что это работает, а это значит, что я что-то упускаю — что я неправильно понял? - person Taryn East; 25.02.2010

Вы можете добавить эту строку в контроллер сеанса после успешного входа в систему:

redirect_to :controller => 'dashboard', :action => 'index'
person Tim Sullivan    schedule 24.05.2009

Я использую Bort, поэтому, возможно, это не часть самого Restful_Authentication, но в контроллере сеансов есть метод successful_login, который использует этот метод restful_auth:

redirect_back_or_default( root_path )

который определен в authenticated_system.rb

    def redirect_back_or_default(default)
      redirect_to(session[:return_to] || default)
      session[:return_to] = nil
    end
person srboisvert    schedule 24.05.2009

Разве вы не можете просто настроить свои маршруты, чтобы

map.root :controller => :users, :action => :search

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

person Lukas    schedule 20.11.2009
comment
Я думаю, что постер не хочет перенаправлять, если они входят в систему с помощью других методов - только если они вошли в систему через файл cookie. Поправьте меня если я ошибаюсь. - person Taryn East; 25.02.2010

Restful Authentication сохраняет исходный URL-адрес, к которому пытались получить доступ при выполнении запроса. Все, что вам нужно сделать, это запретить ему сохранять это значение ИЛИ очистить это значение, когда выполняется аутентификация cookie, и тогда пользователь будет перенаправлен обратно на вашу страницу по умолчанию.

Я бы, наверное, сделал это так в authentication_system.rb

 def login_from_cookie
  user = cookies[:auth_token] && User.find_by_remember_token(cookies[:auth_token])
  if user && user.remember_token?
    self.current_user = user
    session[:return_to] = nil # This clears out the return value so the user will get redirected to the default path
    handle_remember_cookie! false # freshen cookie token (keeping date)
    self.current_user
  end
end

Это session[:return_to] = nil

Затем просто убедитесь, что вы установили путь по умолчанию в контроллере сеансов, и все должно быть настроено. Код в вашем контроллере сеансов должен быть примерно таким:

redirect_back_or_default(the_path_you_want_to_send_them_to)
person Greg DeVore    schedule 25.11.2009