【问题标题】:Rails 4 : Customize Devise 3.1.0 for multiple roleRails 4:为多个角色自定义 Devise 3.1.0
【发布时间】:2013-10-21 04:46:51
【问题描述】:

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

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

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

我知道我可以覆盖 Devise::RegistrationController,但查看他们原来的 update 方法让我觉得如果我复制他们的代码并修改我的代码以使其正常工作,代码会变得臃肿。

我特别关心strong parameters。让我解释一下,实际上我覆盖了Devise::RegistrationsController上的account_update_params

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

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

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

谢谢大家

【问题讨论】:

    标签: ruby-on-rails devise customization


    【解决方案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 仍然会发送确认邮件等。

    【讨论】:

    • 感谢您的帮助。我不知道使用User.create 仍然会使身份验证引擎工作。它解决了我的问题,知道这一点。谢谢:)
    • 酷,我花了几天的开发时间来尝试克服这样的问题。设计很棒,但很难定制。
    【解决方案2】:

    这是我的做法

    假设: 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 中的 devise create

    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 中路由到该操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2013-07-18
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2014-02-10
      • 2023-03-03
      相关资源
      最近更新 更多