自定义设计会话控制器无法按预期工作

时间:2012-10-22 13:39:07

标签: session devise controller ruby-on-rails-3.2 customization

我按照正式指示定制了一些Devise的控制器:

  • config / routes.rb已修改为:

    devise_for:admin_utilisateurs,:controllers => {:registrations => 'admin_utilisateurs / registrations',:sessions => 'admin_utilisateurs /会话'}

  • 已生成视图并已从app / view / devise /移至 /应用程序/视图/ admin_utilisateurs /

    我还为admin_utilisateurs定制了模型和迁移,以便拥有一个“活动”列。这样管理员可以手动停用该帐户。

基本上,我想要的是,如果用户的admin_utilisateur.active attribut为false,则用户无法签名。

这导致我进行以下修改:

class AdminUtilisateurs::SessionsController < Devise::SessionsController

  # Surcharge of 'create' method in Devise::SessionsController
  # Example ressource : http://www.communityguides.eu/articles/10
  def create

    @admin_utilisateur = AdminUtilisateur.find_by_email(params[:email])

    if @admin_utilisateur.present? && @admin_utilisateur.active
      super

    else
      flash.now[:alert] = t('devise.failure.desactive')
      render :new and return

    end
  end
end

正在发生的事情是Rails转到app / controllers / admin_utilisateurs / sessions_controller.rb的正确定制'create'方法

如果用户未被管理员“激活”(admin_utilisateur.active = false),那么我收到了正确的FLASH消息,但RAILS会对其进行身份验证! 因此,用户仍然可以访问所有资源,即使是那些由“before_filter:authenticate_admin_utilisateur!”守护的资源。各自控制人员的指示。

看起来Rails仍然以某种方式进行身份验证,尽管“创建”方法没有编码来执行此操作。

欢迎任何帮助! 非常感谢

1 个答案:

答案 0 :(得分:0)

好的,我看到的唯一解释是关于设计控制器顶部的 prepend_before_filter 调用:

prepend_before_filter :allow_params_authentication!, :only => :create

RDoc说:告诉看守,该特定页面允许使用params身份验证。

我不明白监狱长是如何运作的。

无论如何!

我用wiki给出的另一个解决方案解决了我的问题:Require admin to activate account before sign_in

所以我回滚了我的迁移。我修改了ii,以便列:desactive变为:approved。我迁移。我使用以下内容修改了我的模型app / models / admin_utilisateur.rb:

def active_for_authentication? 
  super && approved? 
end 

def inactive_message 
  approved?  ? super : :not_approved 
end

我在config / locales / fr.yml

中添加了所需的密钥

它很棒!为什么总是这么容易变得容易,而且很容易使它变得困难; - )