2013-10-21 27 views
0

我遇到了使用Devise的問題。那麼這不是一個真正的問題,但更多的是「我不知道該怎麼做」。Rails 4:爲多個角色定製Devise 3.1.0

我實際上在我的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在應用程序內但不是在註銷時允許的最佳方式?

感謝大家

回答

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,設計仍然會發送確認電子郵件等

+0

謝謝你的幫助。我不知道使用'User.create'仍然會使認證引擎工作。它解決了我的問題,知道這一點。謝謝:) – lkartono

+0

酷,雅我花了幾天的設計嘗試克服這樣的問題。設計是太棒了,但可能很難定製。 – OneChillDude

0

這裏是我如何做到這一點

假設: 1.當用戶註冊時,他是爲新公司的管理 2用戶可以在應用程序由管理員或您將應用

首先,創建一個after_create在應用程序/模型/ user.rb用戶模型

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 

然後覆蓋色器件創建我一些其他的邏輯來創建n 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 

現在,當有人去你的註冊應用程序,並在用戶名/密碼使他們將獲得一個新的帳戶和用戶模型將創建一個新帳戶,爲您和設置新用戶作爲管理員。

如果該用戶登錄,他們可以創建新用戶,那麼設計將會看到用戶已登錄並將新用戶分配給當前用戶帳戶。

現在,您可以爲管理員/組添加任何邏輯,並且可以創建新用戶,而無需擔心將邏輯添加到表單中。

另一種替代方法是在控制器中創建一個單獨的動作,如'inappcreate',並路由到用戶_form中。