Цикл перенаправления с Devise after_sign_in_path_for - PullRequest
9 голосов
/ 02 декабря 2010

У меня небольшая проблема с нубами.Я хотел получить устройство для перенаправления на последнюю страницу, которую посетил пользователь.Поэтому я сделал следующее ...

def after_sign_in_path_for(resource)
    request.referer
end

Отлично работает ... за исключением случаев, когда пользователь фактически входит в систему через исходную форму, что вызывает цикл перенаправления.

Я пытался

def after_sign_in_path_for(resource)
   if (request.referer == "/users/sign_in")
  :pages_home
 else
  request.referer
 end

end

Но это не работает, скорее всего потому, что я понятия не имею, что на самом деле возвращает request.referer, когда он встречает исходную страницу входа пользователя (www.example.com/users/sign_in).

Есть идеи?

tldr;Используя devise, я хочу перенаправить на страницу, с которой вы вошли (т. Е. / Blog / 4), если эта страница не является / users / sign_in

право.Request.referer также возвращал домен ...

http://example.com/users/sign_in

(примечание: без префикса www)

Я все еще заинтересован в альтернативе request.referer, если егонебезопасный или неэффективный способ.

Ответы [ 4 ]

12 голосов
/ 02 декабря 2010

Не перенаправлять на рефералов - это вообще плохая идея.

Вместо этого передайте значение next через строку запроса или данные формы. Возможно, используйте что-то вроде:

def after_sign_in_path_for(resource)
  params[:next] || super
end

Когда пользователь пытается посетить страницу, требующую аутентификации (например, /admin/posts/3/edit), аутентификация before_filter выдает redirect_to new_session_url(:next => request.path). Затем закодируйте действие входа в систему и просмотрите, чтобы сохранить параметр строки запроса :next.

2 голосов
/ 14 сентября 2011

Я взял ответ Джастиса и изменил его, чтобы использовать вместо него сессии.

Насколько я вижу, сеансы проще, чем добавление URL-адреса в качестве параметра, но они могут вести себя неожиданно, например, когда пользователь просматривает сайт на нескольких вкладках. Использование сессий менее RESTfull, но проще и чище.

При использовании CanCan, установка пути перенаправления может быть выполнена в центральном месте: место, где обрабатываются исключения «отказано в доступе»:

  rescue_from CanCan::AccessDenied do |exception|
    if current_user.nil?
      session[:next] = request.fullpath
      puts session[:next]
      redirect_to new_user_session_path, :alert => exception.message
    else
      render :file => "#{Rails.root}/public/403.html", :status => 403
    end
  end

Но вы можете установить это где угодно, на самом деле:

 def edit
   if current_user.roles[:moderator].nil?
     session[:next] = "/contact"
     redirect_to new_user_session_path, :alert => "please contact the moderator for access"
   end
   # ...
 end

Затем в ApplicationController вы можете повторно использовать это значение сеанса. Убедитесь, что удалили его тоже, хотя.

  def after_sign_in_path_for(resource)
    path = ''
    if session[:next]
      path = session[:next]
      session[:next] = nil
    else
      path = super
    end

    path
  end
2 голосов
/ 28 декабря 2010

Как насчет этого:

def after_sign_in_path_for(resource)
  sign_in_url = url_for(:action => 'sign_in', :controller => 'users', :only_path => false, :protocol => 'http')  
  if (request.referer == sign_in_url)
    super
  else
    request.referer
  end
end
0 голосов
/ 15 марта 2013

Вот мой код для rescue_from CanCan.

rescue_from CanCan::AccessDenied do |exception|
  if current_user.nil?
    session[:next] = request.fullpath
    puts session[:next]
    redirect_to login_url, :alert => "You have  to be logged in to continue"
  else
    #render :file => "#{Rails.root}/public/403.html", :status => 403
    if request.env["HTTP_REFERER"].present?
      redirect_to :back, :alert => exception.message
    else
      redirect_to root_url, :alert => exception.message
    end
  end
end

Что это делает: - если пользователь не вошел в систему, он перенаправляет на страницу входа - если пользователь вошел в систему, но не имеет возможности увидеть действие, он перенаправляет обратно или на корневую страницу с предупреждением флэш-сообщение

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