0

我在使用 Devise 时遇到问题。好吧,这不是真正的问题,而是“我不知道该怎么做”。

我实际上在我的 Rails 4 应用程序上使用了 Devise 3.1.0。到目前为止,我只有我sign up的用户可以通过它来将自己注册到系统中。

问题是现在,我正在为每个用户添加组和角色,因为每个用户都属于一个特定的组(公司本身)。所以在这种情况下,当用户第一次注册时,他注册为管理员并创建了他的公司。但是假设在这个应用程序内部,这个管理员想要创建其他用户,这些用户都属于那个特定的公司。

我知道我可以覆盖他们的原始方法,Devise::RegistrationController但看着他们的原始update方法让我觉得如果我复制他们的代码并破解我的代码以使其工作,代码会变得臃肿。

我特别关心的是strong parameters. 让我解释一下,实际上我覆盖了account_update_paramsDevise::RegistrationsController

protected
  def account_update_params
    params.require(:user).permit(:lastname, :firstname, :email, :current_password, :password, :password_confirmation)
  end

但是,如果我想以管理员身份从应用程序添加帐户,我还需要允许:role这可能是注册表单中的安全问题。如果有人在注册时尝试向角色注入一些东西怎么办?

如何以最好的方式:role只允许在应用程序内部而不是在注销时允许?

谢谢大家

4

2 回答 2

1

是的,我也讨厌覆盖设计控制器。设计的部分问题在于它可能有些僵化且无法定制。

在您的 routes.rb 文件中,创建一个新路由。

get '/users/sign_up_as/:role' => 'devise/registrations/#new', :as => 'new_user_registration'

然后用该行修改设计注册视图

<%= f.hidden_field :role, :value => params[:role] %>

要创建注册链接,您可以这样做

= link_to 'Sign Up', new_user_registration_path(:role => 'admin')

另请记住,您不需要为表单本身使用设计注册控制器。如果你运行User.create,devise 仍然会发送确认邮件等。

于 2013-10-21T05:01:11.957 回答
0

这是我的做法

假设: 1. 当用户注册时,他是新公司的管理员 2. 用户可以由管理员或您将应用的其他逻辑在应用程序中创建

首先,在 app/models/user.rb 中为 User 模型创建一个 after_create

class User < ActiveRecord::Base
  after_create :set_account_and_admin

  protected
   def set_account_and_admin

   if self.account_id.nil?
     @account = Account.create!
     self.update(account_id: @account.id, admin: true)
   end
 end

然后覆盖 app/controllers/registrations_conroller.rb 中的设计创建

def create
  build_resource(sign_up_params)

  if current_user
    resource.account_id = current_user.account_id
  end

  #...rest of devise stuff taken from the gem
end

现在,当有人进入您的注册应用程序并输入用户/密码时,他们将获得一个新帐户,用户模型将为您创建一个新帐户并将该新用户设置为管理员。

如果该用户登录,他们可以创建新用户,那么 devise 将看到该用户已登录并将新用户分配给当前用户帐户。

现在您可以为管理员/组添加任何逻辑以及谁可以创建新用户,而不必担心将逻辑添加到表单中。

另一种替代方法是在控制器中进行单独的操作,例如“inappcreate”,并在用户_form 中路由到该操作。

于 2013-10-21T13:37:05.330 回答