0

我按照官方说明定制了一些 Devise 的控制器:

  • config/routes.rb 已修改为:

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

  • 视图已生成并从 app/view/devise/ 移动到 /app/view/admin_utilisateurs/

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

基本上,我想要的是,如果用户的 admin_utilisateur.active 属性为假,则用户不应该能够登录。

这导致我进行以下修改:

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

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

看起来 Rails si 仍然以某种方式进行身份验证,尽管“创建”方法没有编码这样做。

欢迎任何帮助!非常感谢

4

1 回答 1

0

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

prepend_before_filter :allow_params_authentication!, :only => :create

RDoc 说:告诉守望者该特定页面允许参数身份验证。

我也不明白守望者是如何工作的。

反正 !

我用 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

而且效果很好!!!为什么让它变得简单总是那么困难,而让它变得困难则容易;-)

于 2012-10-23T16:08:59.680 回答