任何人都可以指出我们如何自定义Devise,以便如果未经身份验证的用户访问root_url,则会将其重定向到/ users / sign_in,但不会显示“您需要在继续之前登录或注册”。错误消息?
进一步扩展:如果用户在没有首先进行身份验证的情况下尝试直接访问“更深层次”的URL(/ controller / restricted_action),我们希望显示该消息,但对于将应用程序标记为www.app.com的用户,我们只是想将它们直接重定向到登录页面而不会显示任何错误。
浏览SessionsController(以确定自定义控制器是否可以工作)和其他各种地方,但看不到地方或我们如何以这种方式覆盖行为。
任何建议表示赞赏!
答案 0 :(得分:1)
如果从" /"重定向,则应该删除闪光警报消息。到" / users / sign_in"。
class ApplicationController < ActionController::Base
before_action :keep_previous_url
before_action :no_unauthenticated_alert_if_redirected_from_root
def keep_previous_url
session[:previous_url] = request.fullpath
end
def no_unauthenticated_alert_if_redirected_from_root
if request.fullpath == "/users/sign_in" && session[:previous_url] == "/"
flash.now.alert = nil
end
end
end
答案 1 :(得分:0)
@Anthony的上述建议很好。尽管我认为我们可以在此方面进行一些改进。使用以下解决方案,在before_action
中仅调用1个ApplicationController
(越好越好,因为它被所有人使用),然后在根控制器或主控制器本身中调用一个。
另外,它不会继续在用户会话中不必要地存储previous_url
,从而节省了内存。
将此添加到您的ApplicationController
:
class ApplicationController < ActionController::Base
before_action :_no_unauthenticated_alert_if_redirected_from_root
private
def _no_unauthenticated_alert_if_redirected_from_root
return if session[:requiring_sign_in_from_root] != true
session[:requiring_sign_in_from_root] = nil
flash.clear
end
end
并将其添加到提供根“ /”网址的控制器:
class HomeController < ApplicationController
prepend_before_action :_check_if_requiring_sign_in_from_root
private
def _check_if_requiring_sign_in_from_root
session[:requiring_sign_in_from_root] = true unless user_signed_in?
end
end
这些方法不必是私有的,但是我认为这是一个好习惯。
答案 2 :(得分:0)
我已通过以下操作解决了此问题:
...this.filtersList.map((f) => f.filtersChanges)
现在我在转到根路由时没有出现错误消息。
来源:https://github.com/heartcombo/devise/wiki/How-To:-Require-authentication-for-all-pages