ruby-on-rails - "You are already signed in."是否有设计回调?

标签 ruby-on-rails authentication devise callback

当我重温 /users/sign_in已经登录后,我看到了闪光 You are already signed 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

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

最后,编辑您的路由文件以使此更改生效:
# routes.rb
devise_for :users, :controllers => { :sessions => 'sessions' }

关于ruby-on-rails - "You are already signed in."是否有设计回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22371512/

相关文章:

mysql - Rails连接Mysql时的"Access Denied"

c# - 在 Mongo .NET 2.0 驱动程序中捕获 MongoAuthenticationException

authentication - 如何从断开的网络生成 SSL 客户端证书?

ruby-on-rails-4 - Rails 4 Paperclip with Devise,文件保存错误

ruby-on-rails - rake-pipeline 在指定的输出目录中进行脂肪转储,我该如何停止呢?

javascript - 必填字段未收到 form_for 错误

ruby-on-rails - bool 值为假且属性存在的文章 - Rails 4

facebook - 在 native 桌面应用程序中使用 Facebook 登录

iphone - 从 JSON 在 Devise 中创建用户

ruby-on-rails - 使用 Devise 时未定义的方法 confirmed_at