我觉得答案是"它的内置,虚拟"但是我无法找到证明我怀疑的文件。
我使用Devise作为Rails应用程序,简而言之,我的问题是:"如何创建新的管理员用户?"我问的原因是,遵循Devise文档似乎只是创建了一个公开/ admins / sign_up URL的结构,类似于它为新用户公开/ users / sign_up URL的方式。
现在,一般,我不希望任何人去/ admins / sign_up看他们是否可以。但我真的不愿意接受这一点,并制造一个(相当大的)漏洞。所以,我的后续问题是:"我如何保护管理员注册,以便只有合适的人才能看到它?"和/或"使用设计处理管理员帐户的更好的替代方法是什么?"
编辑1
我发现发现(in their docs)显然是确保管理员注册的答案。如果我在管理模型中删除:registerable
和其他一些配置选项,并使用适当的设置运行迁移,则该路由无法用于访问任何类型的管理员注册。很好。
我想我的第一个问题现在仍然存在:"我现在如何创建一个新的管理员?"这并不是说任何人都可以进入并注册成为管理员,但我也不知道我或其他任何人如何创建管理员帐户。
答案 0 :(得分:1)
Devise是用于身份验证的绝佳宝石,但它缺少一些关键功能,例如您只希望管理员创建用户。这是很多项目的通用要求。
对于这个问题,没有单一的解决方案。
以下是设计/设想的一些事情。
现在我们要改变以上三种行为
我假设您的用户模型为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
以下是处理上述三个问题的方法。
before_action
确保用户已登录,并重定向,除非他们是管理员,如果他们尝试注册。require_no_authentication
方法引起的,跳过它可以解决问题。sign_up
帮助程序方法会被覆盖,以防止自动登录。