2010-05-17 37 views
7

我有一個具有超過50列的用戶表的全功能身份驗證系統。這很簡單,但它使用salt進行散列加密,使用電子郵件而不是用戶名,並且具有兩個不同類型的用戶以及管理員。將設計認證合併到已經存在的用戶結構中嗎?

我期待將Devise身份驗證合併到我的應用程序中,以增強電子郵件驗證,忘記密碼,記住我的令牌等額外部件......我只是想看看是否有人有任何建議或問題,將Devise合併到已經存在的用戶結構中時遇到過。在我的用戶模型的基本字段有:

t.string :first_name, :null => false 
    t.string :last_name, :null => false 
    t.string :email, :null => false 
    t.string :hashed_password 
    t.string :salt 
    t.boolean :is_userA, :default => false 
    t.boolean :is_userB, :default => false 
    t.boolean :is_admin, :default => false 
    t.boolean :active, :default => true 
    t.timestamps 

以供參考,在這裏是從遷移的設計領域:

t.database_authenticatable :null => false 
    t.confirmable 
    t.recoverable 
    t.rememberable 
    t.trackable 

    add_index "users", ["confirmation_token"], :name => "index_users_on_confirmation_token", :unique => true 
    add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
    add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true 

,最終變成架構中的這些實際的領域:

t.string "email",        :default => "", :null => false 
t.string "encrypted_password", :limit => 128, :default => "", :null => false 
t.string "password_salt",      :default => "", :null => false 
t.string "confirmation_token" 
t.datetime "confirmed_at" 
t.datetime "confirmation_sent_at" 
t.string "reset_password_token" 
t.string "remember_token" 
t.datetime "remember_created_at" 
t.integer "sign_in_count",      :default => 0 
t.datetime "current_sign_in_at" 
t.datetime "last_sign_in_at" 
t.string "current_sign_in_ip" 
t.string "last_sign_in_ip" 
t.datetime "created_at" 
t.datetime "updated_at" 

你們推薦什麼?我只是從我的遷移中刪除電子郵件,hashed_pa​​ssword和鹽,並將其放入5 Devise遷移字段,一切都會好的,或者我需要做其他事情嗎?

編輯:

我已經開始這種嘗試自己和已經碰到一些問題。我加了色器件移植領域我上面把現有的用戶模型顯示,現在當我跑我的種子文件,它給了我這個PostgreSQL的錯誤:

ERROR: duplicate key value violates unique constraint "index_users_on_email" 

我的種子文件:

initial_usersA = User.create!(
[ 
{ 
    :first_name => "John", 
    :last_name => "Doe", 
    :email => "[email protected]", 
    :is_userA => true, 
    :is_userB => false, 
      :is_admin => true, 
    :password => "password", 
    :password_confirmation => "password" 
}, 
{ 
    :first_name => "Jane", 
    :last_name => "Smith", 
    :email => "[email protected]", 
    :is_userA => true, 
    :is_userB => false, 
      :is_admin => true, 
    :password => "password", 
    :password_confirmation => "password" 
} 

用戶模型:

devise :registerable, :authenticatable, :recoverable, 
    :rememberable, :trackable, :validatable 
attr_accessor :password_confirmation, :email, :password 

堆棧跟蹤顯示電子郵件顯然沒有被送入由於某種原因變量的休息......雖然一切在種子文件中的ACTUA顯示出來l查詢,電子郵件是「由於某種原因,即使它是明確defined.auth

回答

0

我會擺脫:默認=>」「在您的模式中的電子郵件。設計把唯一約束由默認的電子郵件,所以你不想空字符串的默認

2

兩個主要考慮我記得我們面對的時候我們做了類似的事情是:

數據庫遷移 - 而不是使用t.database_authenticatable助手,我們編寫了單獨的add_column and rename_column語句,以便我們不會遇到任何重複的列或索引錯誤,因此我們可以在Devise中重複使用我們的鹽密碼,而不必修改寶石工程。

第二個也是更大的考慮是我們使用的散列算法與Devise提供的散列算法不同,所以我們必須編寫我們自己的加密器類作爲Devise::Encryptors::Base的子類,並使用digest函數我們自己的邏輯。最後,我們通過在相應的config/initializer文件中指定它來配置Devise來使用這個加密器。我希望這能夠讓你開始。

+2

此頁面有一個wiki-how-to可以幫助。 https://github.com/plataformatec/devise/wiki/How-To:-change-an-already-existing-table-to-add-devise-required-columns – GeorgeW 2012-03-04 03:08:45

0

我切換從authLogic(我認爲)的應用,去年,以制訂和我的教訓是: - 用戶表可以留 - 重命名字段制定的標準,我敢肯定,這不應該是必要的,但與其他身份驗證方法不同,我沒有找到一個lib映射文件,我可以在其中添加不同的db字段名稱,就像我對其他身份驗證方法所做的那樣。

這實際上是關於它。對於我需要做的事情我感到非常驚訝。我認爲我的哈希函數實際上仍然有效,或者我按照指令改變了常規。

我使用'管理'標誌路由設計,所以做任何目前使用的SQL轉換可以做到這一點。我有一個生產應用程序(不知道它使用什麼認證,我認爲一些base64的東西),看起來像這樣: t.string「EMAIL」,::limit => 64,:null => false t.string「PASSWORD」,:limit => 64,:null => false

相關問題