加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 是否有一个Devise回调“你已经登录了.”?

发布时间:2020-12-17 03:48:53 所属栏目:百科 来源:网络整理
导读:当我在登录后重新访问/ users / sign_in时,我看到你已登录的闪存.以及我的日志中的以下内容.. Filter chain halted as :require_no_authentication rendered or redirected ..我被重定向到/.我想根据某些条件调用回调和重定向. 这与after_sign_up_path_for的
当我在登录后重新访问/ users / sign_in时,我看到你已登录的闪存.以及我的日志中的以下内容..

Filter chain halted as :require_no_authentication rendered or redirected

..我被重定向到/.我想根据某些条件调用回调和重定向.

这与after_sign_up_path_for的精神相似,不同之处在于它更像是“在登录后尝试登录”.

解决方法

现在,没有简单的方法来实现你想要的. (也许拉出请求是有序的.)

问题是when the user is already authenticated,Devise调用after_sign_in_path_for方法.

当用户正常登录时也会调用此方法,因此即使您重写此方法,也无法区分刚刚登录的用户和已登录的用户.

唯一的解决方案是扩展/覆盖Devise的SessionsController:

class SessionsController < Devise::SessionsController

  private

  def require_no_authentication
    assert_is_devise_resource!
    return unless is_navigational_format?
    no_input = devise_mapping.no_input_strategies

    authenticated = if no_input.present?
      args = no_input.dup.push scope: resource_name
      warden.authenticate?(*args)
    else
      warden.authenticated?(resource_name)
    end

    if authenticated && resource = warden.user(resource_name)
      flash[:alert] = I18n.t("devise.failure.already_authenticated")
      redirect_to YOUR_PATH_HERE
    end
  end
end

由于此控制器继承自Devise,因此当您的控制器中未定义操作时,Devise的控制器将处理该操作.所以你只需要覆盖require_no_authentication方法,即is called in a before_filter.

最后,编辑您的路线文件,以使此更改生效:

# routes.rb
devise_for :users,:controllers => { :sessions => 'sessions' }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读