rails:3 设计注册过滤器链停止为 :require_no_authentication 呈现或重定向

Posted

技术标签:

【中文标题】rails:3 设计注册过滤器链停止为 :require_no_authentication 呈现或重定向【英文标题】:rails:3 Devise signup Filter chain halted as :require_no_authentication rendered or redirected 【发布时间】:2012-03-26 17:58:31 【问题描述】:

我在我的站点中使用设计我创建管理员命名空间并提供由管理员创建用户的功能。 我的路线如下

devise_for :users,:has_many => :comments, :controllers => :sessions =>'devise/sessions',:registrations => 'devise/registrations' do    
  get "/login", :to => "devise/sessions#new", :as => :login  

  get "/signup", :to => "devise/registrations#new", :as => :signup     

  get "/logout", :to => "devise/sessions#destroy", :as => :logout
end

当我点击带有 signup_path 的 add_user 链接时导致以下错误:

我的错误

 Started GET "/signup" for 127.0.0.1 at Fri Mar 09 12:49:11 +0530 2012    
 Processing by Devise::RegistrationsController#new as html    
 User Load (0.1ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 35 LIMIT 1    
 Redirected to http://localhost:3000/admin     
 Filter chain halted as :require_no_authentication rendered or redirected
 Completed 302 Found in 3ms (ActiveRecord: 0.1ms)

我认为它会进入设计注册控制器,但由于以下行,它会导致设计注册控制器出错

prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]

【问题讨论】:

您确定您没有登录用户吗?尝试注销(或清除您域的 cookie)并查看它是否有效。 是的,我以管理员身份登录,管理员可以添加用户,因此添加用户页面(注册)可以打开并且不会重定向到 localhost:3000/admin。 正如我所说,我认为问题是 prepend_before_filter :require_no_authentication,:only => [:new,:create,:cancel]。我的助手中应该有 require_no_authentication 方法吗? 除上述之外,我在 app/controllers 下创建了一个带有空白方法 'index' 的 'welcome_controller.rb' 文件,并在 config/routes 中添加了 'root to: 'welcome#index' .rb 文件。 【参考方案1】:

Devise 控制器上提到的行在一般情况下是有意义的:登录用户无法注册。当您遇到只有管理员可以创建用户的情况时,我建议您不要在 Registerable 模块上使用 Devise 的控制器,而是使用您自己的规则编写您自己的控制器。您可以根据 Devise 的控制器仅更改上述行来编写它。

如果您想使用它,请尝试使用skip_before_filter 跳过before_filter。我不认为这是最好的解决方案。我会编写自己的控制器。

【讨论】:

【参考方案2】:

我在开发日志中收到以下错误。

Filter chain halted as :require_no_authentication

创建了一个无限循环,因为在 application_controller.rb 中设计的 after_sign_in_path_for 使用

重定向回上一页
stored_location_for(resource)

编辑密码时,Devise 的 gem 会登录用户。

【讨论】:

这个问题的解决方案是什么。我也面临同样的问题。【参考方案3】:

和您一样,我希望管理员用户能够添加新用户。但我不想弄乱 Devise Registerable,因为我实际上希望用户仍然能够注册自己。我有一些管理员用户有权添加新用户,所以我在我的用户控制器中创建了额外的方法和额外的视图来处理这种情况。

Devise 的 prepend_before_filter :require_no_authentication 没有引用我的其他方法,因此它们不会收到错误。

我的食谱:

在 app/controllers/users_controller.rb (或您使用的任何对象)中: 复制 new、create 和 update 方法并将副本重命名为 admin_new、admin_create 和 admin_update。

在 app/views/users 中,将 new.html.erb 复制到 admin_new.html.erb 将部分更改为引用 admin_form 而不是 form:

 <%= render 'admin_form' %>

然后将部分 _form.html.erb 复制到 _admin_form.html.erb。在 _admin_form.html.erb 中,更改 form_for 以使用不同的 URL:

form_for(@user, :url => '/users/admin_create')

在 config/routes.rb 中添加路由以指向用户控制器中的备用方法:

devise_scope :user  do
    ...
    get  'users/admin_new' => 'users#admin_new'
    post 'users/admin_create' => 'users#admin_create'
end

现在您可以在登录时通过转到 /users/admin_new 添加用户,并且用户仍然可以使用您没有干扰的设计机制创建自己的用户(注册)。

【讨论】:

您的解决方法为我解决了一个大问题,Don Law。谢谢!【参考方案4】:

我有一个更简单的解决方案:

prepend_before_filter :require_no_authentication, only: [:cancel ]

通过从prepend_before_filter 中删除:new, :create,它会覆盖设计源代码并解决问题。我遇到了同样的问题,它解决了我的问题。

【讨论】:

一个班轮。 +1 简洁 @antoine 在哪里添加此代码??你能解释一下吗 @pawankumar 有一种方法可以使用class RegistrationsController &lt; Devise::RegistrationsController 管理设计注册在其中,第一行将声明prepend_before_filter :require_no_authentication, only: [:cancel ]【参考方案5】:

我还在我的应用程序中注意到,当我创建用户并以该用户身份登录时,rails 服务器控制台会显示上述消息,并且我被重定向到 rails localhost 默认窗口“是的,您在 Rails 上”。

这是因为没有定义任何页面来获取登录用户。当我在文件夹中定义欢迎页面“index.html.erb”时,例如“views”文件夹下的“welcome”,登录成功并且有效。你可以试试这个。

【讨论】:

以上是关于rails:3 设计注册过滤器链停止为 :require_no_authentication 呈现或重定向的主要内容,如果未能解决你的问题,请参考以下文章

过滤器链及责任链设计模式

设计模式责任链模式

设计模式-责任链模式

设计模式责任链模式——过滤器案例

设计模式责任链模式——过滤器案例

设计模式责任链模式——过滤器案例