无法在设计中关闭require_no_authentication

时间:2014-06-12 09:42:07

标签: ruby-on-rails devise

我知道已经有一些关于此问题的堆栈溢出问题,但它们并没有帮助解决我的问题。

我有一个自定义用户注册控制器,它继承了设计注册控制器,即:

class UsersController < Devise::RegistrationsController

我想在设计注册控制器中禁用身份验证过滤器。即禁用此行:

class Devise::RegistrationsController < DeviseController
    prepend_before_filter :require_no_authentication, only: [ :new, :create, :cancel ]

因此无需身份验证即可编辑用户。

其他堆栈溢出答案建议跳过自定义控制器中的过滤器,即

class UsersController < Devise::RegistrationsController
   skip_before_filter :require_no_authentication
end

但这对我不起作用。当我尝试编辑用户时,会显示一个页面:

you need to sign in or sign up before continuing.

我不认为我的路由是一个问题。我的路线是:

devise_for :users, :skip => [:sessions, :registrations, :passwords]

devise_scope :user do
    resources :user
end

谢谢,非常感谢

2 个答案:

答案 0 :(得分:0)

你正在寻找这样的东西:

skip_before_filter :authenticate_user!, :only => [:edit]

您禁用的前置过滤器不用于跳过授权。它用于检查现有的有效会话是否已存在。重定向和消息在最后几行中暗示了这一点。如果希望用户能够在不注销的情况下切换会话,或者作为保护旧会话不被恢复的安全措施,这是非常方便的。

  # Helper for use in before_actions where no authentication is required.
  #
  # Example:
  #   before_action :require_no_authentication, only: :new
  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 after_sign_in_path_for(resource)
    end
  end

答案 1 :(得分:-1)

应用以下内容:

class Users::RegistrationsController < Devise::RegistrationsController
  skip_before_action :require_no_authentication
end