使用Devise

时间:2016-08-19 18:57:58

标签: ruby-on-rails devise

我觉得答案是"它的内置,虚拟"但是我无法找到证明我怀疑的文件。

我使用Devise作为Rails应用程序,简而言之,我的问题是:"如何创建新的管理员用户?"我问的原因是,遵循Devise文档似乎只是创建了一个公开/ admins / sign_up URL的结构,类似于它为新用户公开/ users / sign_up URL的方式。

现在,一般,我不希望任何人去/ admins / sign_up看他们是否可以。但我真的不愿意接受这一点,并制造一个(相当大的)漏洞。所以,我的后续问题是:"我如何保护管理员注册,以便只有合适的人才能看到它?"和/或"使用设计处理管理员帐户的更好的替代方法是什么?"

编辑1
我发现发现(in their docs)显然是确保管理员注册的答案。如果我在管理模型中删除:registerable和其他一些配置选项,并使用适当的设置运行迁移,则该路由无法用于访问任何类型的管理员注册。很好。

我想我的第一个问题现在仍然存在:"我现在如何创建一个新的管理员?"这并不是说任何人都可以进入并注册成为管理员,但我也不知道我或其他任何人如何创建管理员帐户。

1 个答案:

答案 0 :(得分:1)

Devise是用于身份验证的绝佳宝石,但它缺少一些关键功能,例如您只希望管理员创建用户。这是很多项目的通用要求。

对于这个问题,没有单一的解决方案。

以下是设计/设想的一些事情。

  1. 注册是公开的
  2. 登录用户已无法注册
  3. 注册成功后,新注册的用户将自动登录。
  4. 现在我们要改变以上三种行为

    我假设您的用户模型为user并为user配置设计

    首先,您需要覆盖设计注册控制器。

     ## app/controllers/registrations_controller.rb
    class RegistrationsController < Devise::RegistrationsController
      before_action :authenticate_user!, :redirect_unless_admin,  only: [:new, :create]
      skip_before_action :require_no_authentication
    
      private
      def redirect_unless_admin
        unless current_user.try(:admin?)
          flash[:error] = "Only admins can do that"
          redirect_to root_path
        end
      end
    
      def sign_up(resource_name, resource)
        true
      end
    end
    
    
    # config/routes.rb
    Rails.application.routes.draw do
      devise_for :users, :controllers => { :registrations => 'registrations'}
    end
    

    以下是处理上述三个问题的方法。

    1. before_action确保用户已登录,并重定向,除非他们是管理员,如果他们尝试注册。
    2. 已登录的问题是由Devise的require_no_authentication方法引起的,跳过它可以解决问题。
    3. 接下来是新创建的用户自动登录。执行此操作的sign_up帮助程序方法会被覆盖,以防止自动登录。