Перенаправить на страницу входа, если пользователь не авторизован в Devise
Я использую Devise с Ruby on Rails.
Каков рекомендуемый способ перенаправления неаутентифицированных пользователей на новую страницу сессий, если они пытаются получить доступ к странице, требующей аутентификации?
Прямо сейчас я получаю сообщение об ошибке, согласно которому ни один маршрут не совпадает с тем, к которому они пытаются получить доступ (что приводит к ошибке 404 в производственном процессе).
5 ответов
Просто добавьте этот метод в 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
примечание: я всегда использую этот способ, когда играю с devise для аутентификации моих приложений.. (rails 3.2 и rails 4.0.1)
Вы можете сделать так, как написал GeekTol, или просто поставить
before_action :authenticate_user!
в вашем контроллере.
В этом случае devise использует default ate_user по умолчанию! метод, который будет перенаправлять на "user_session_path" и использовать флэш-сообщение по умолчанию.
Нет необходимости переписывать authenticate_user! метод, если вы не хотите настроить его.
Я думал, что вы можете просто добавить: before_action:authenticate_user! к каждому контроллеру, который потребовал, чтобы пользователь вошел в систему.
Я новичок в Rails, но я нашел это в своих собственных поисках, и это хорошо работает в моем приложении.
Вы должны обратиться к собственной инструкции Devise: как: как сделать: перенаправить на определенную страницу, когда пользователь не может пройти аутентификацию.
Еще одна альтернатива, о которой я могу подумать, - это создание ограничения маршрутизации, охватывающего ваши защищенные маршруты. Вы бы лучше придерживались пути Devise, но вот пример:
#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
Добавьте этот код в ваш config/rout.rb devise_for :users
а также resources :users
и вы можете создать устройство в представлениях.