Подтвердить что ты не робот

Перенаправление на страницу входа в систему, если пользователь не аутентифицирован с помощью приложения

Я использую Devise с Ruby on Rails.

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

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

4b9b3361

Ответ 1

Просто добавьте этот метод в application_controller.rb

  protected
  def authenticate_user!
    if user_signed_in?
      super
    else
      redirect_to login_path, :notice => 'if you want to add a notice'
      ## if you want render 404 page
      ## render :file => File.join(Rails.root, 'public/404'), :formats => [:html], :status => 404, :layout => false
    end
  end

И вы можете вызвать этот метод на before_filter других контроллерах, которые вы хотите.

например:

class HomesController < ApplicationController
  before_filter :authenticate_user!
  ## if you want spesific action for require authentication
  ## before_filter :authenticate_user!, :only => [:action1, :action2]
end

Не забудьте добавить login_path в routes.rb

devise_scope :user do
  match '/sign-in' => "devise/sessions#new", :as => :login
end

Примечание: я всегда использую этот способ, когда играю с программой для аутентификации моих приложений.. (rails 3.2 и rails 4.0.1)

Ответ 2

Вы можете делать так, как писал GeekTol, или просто поместите

before_action :authenticate_user!

в вашем контроллере.

В этом случае devise использует значение authenticate_user по умолчанию! метод, который будет перенаправлен на "user_session_path" и использовать флэш-сообщение по умолчанию.

Не нужно переписывать authenticate_user! метод, если вы не хотите его настроить.

Ответ 3

Я думал, вы можете просто добавить: before_action: authenticate_user! для каждого контроллера, который требовал, чтобы пользователь вошел в систему.

Я новичок Rails, но нашел это в своих собственных поисках и хорошо работает в своем приложении.

Ответ 4

Вы должны обратиться к Devise own How To: Как: Перенаправить на определенную страницу, когда пользователь не может быть аутентифицирован.

Другая альтернатива, о которой я могу думать, - это создание ограничения на маршрутизацию, защищающего ваши защищенные маршруты. Вам лучше придерживаться метода "Разработать", но вот пример:

#On your routes.rb
constraints(Constraints::LoginRequired) do
  get '/example' 
end

#Somewhere like lib/constraints/login_required.rb
module Constraints
  class LoginRequired
    def self.matches?(request)
      #some devise code that checks if the user is logged in
    end 
  end
end

Ответ 5

Добавьте этот код в свои config/routes.rb devise_for :users и resources :users, и вы можете генерировать его в виде.