【问题标题】:Devise: Allow only admin to create users设计:只允许管理员创建用户
【发布时间】:2014-05-27 01:07:01
【问题描述】:

我有一个 Rails 4 应用程序。它正在使用devise 3.2.3。设计正确集成。至此,用户可以使用邮箱和密码进行注册,登录并进行CRUD操作。

现在我想做的是:我不想让任何用户自己注册,而是想创建一个adminadmin 将保留创建用户的责任。我不希望用户自己注册。基本上,管理员将创建用户,向他们颁发登录凭据,然后通过电子邮件将其发送给他们。

我在 SO 和设计 wiki 中阅读了 this 的帖子和类似的帖子,但无济于事。

我在users table 中添加了一个boolean 字段来识别管理员用户。

class AddAdminToUser < ActiveRecord::Migration
  def change
    add_column :users, :admin, :boolean, :default => false
  end
end

我已阅读有关使用 cancan 管理用户的信息,但我不知道如何使用它来实现我的目标 我正在寻找的解决方案可能需要devisecancan 的组合。

我将不胜感激有关此问题的任何指导。

【问题讨论】:

  • rails_admin gem 非常适合用于用户管理等。它通过管理界面让您快速启动并运行。
  • @JKen13579 感谢您的提示。我去看看。

标签: ruby-on-rails devise cancan


【解决方案1】:
  1. 确保布尔值 :admin 不在您的 params.permit() 区域中以获得强参数。
  2. 使用 pundit gem,它被维护并且几乎是普通的旧红宝石对象。

然后在你的 UserPolicy 中你会做这样的事情

class UserPolicy < ApplicationPolicy
  def create?
    user.admin?
  end
end

你的模型看起来像这样

class User < ActiveRecord::Base
  def admin?
    admin
  end
end

最后在你的控制器中确保用户被授权执行操作

class UserController < ApplicationController 
  def create
    @user = User.new(user_params)
    authorize @user
  end
end

您可能还想限制显示的按钮,这些按钮可以访问管理员用户创建部分。这些也可以与权威人士一起完成。

【讨论】:

  • 所以我需要创建userscontroller?我为routes做什么?
  • 为什么UserController继承自ActionController?我收到superclass must be a Class (Module given) 错误消息
  • 我的错字,更新了它,你的路线做他们在应用程序中通常做的事情,无论你是通过资源:用户还是其他方式。这样,您的代码就会负责授权。
  • 感谢您的回复。 authorize 在哪里定义?你为什么不保存新用户?出于某种原因,我现在得到:param not found: user。我的 params 方法有这个代码:params.require(:user).permit(:email)。我在users 表中有email 属性
  • 这只是授权逻辑,您仍然需要根据您的操作方式(json、html 等)呈现保存。授权是通过权威人士。听起来您在使用强参数时遇到了麻烦。在您的原始帖子中发布控制器中的强参数部分,我会检查一下。
最近更新 更多