我們有一個MySQL數據庫服務器,裏面有數十個數據庫。我們在控制對各種數據庫的訪問的服務器中有很多用戶帳戶。我想將Rails應用綁定到這些預先存在的帳戶中。我可以找到的每個認證系統(迄今爲止其中的4個)假定我將創建專用於「用戶」模型的表格。我只想使用mysql.user表進行身份驗證,並使用mysql.db表進行授權。有沒有可以使用「真正的」MySQL特權系統的Rails認證系統,而不是在數據庫的TOP上放置一個?這甚至是可取的嗎?如果我必須自己編碼,那麼有沒有人預見到這種方法存在困難?如何將Rails用戶認證/授權綁定到MySQL數據庫服務器中的現有權限?
回答
所以我看到了這個upvoted,一個注意到,我從未發佈我所做的。這是我整理出來的。 「GINA」是一個獨立的遺留數據庫,用於保存數據和用戶帳戶。我在database.yml中爲該連接創建了一個YAML節,並修改了用戶模型以處理該模式。
user.rb
class User < ActiveRecord::Base
establish_connection :gina
self.table_name = "mysql.user"
self.primary_key = "user"
end
users_controller.rb
def authenticate
user = params[:username]
pass = params[:password]
valid = authenticate_user(user, pass)
if valid
session[:username] = user
session[:password] = pass
cookies[:username] = user
cookies[:password] = pass
redirect_to gina_tables_path
else
redirect_to gina_tables_path, :notice => "Login failed."
end
end
application_controller.rb
def authenticate_user(user, pass)
begin
u = nil if u == 'root'
u = User.find(user) # <- Here's the call to get the user, with password.
unless u.nil?
hash = "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest(pass)).upcase
old_hash = old_password(pass)
if u.Password === hash || u.Password === old_hash
session[:username] = user
return true
end
return false
end
rescue Exception => e
Rails.logger.info(e)
return false
end
end
由於用戶模型是由用戶名,用戶的字符串作爲關鍵字。 find(用戶)從MySQL的用戶表中獲取用戶,這會帶來散列的密碼。因此,整個技巧歸結爲使用MySQL使用的完全相同類型的密碼哈希,並將該哈希(提供的密碼)與該用戶的數據庫中的哈希進行比較。如果他們是平等的,那是一個認證登錄。
總之:您的要求是非常異國情調。通常,Web應用程序爲其用戶提供認證/授權系統,允許他們定義角色並將這些角色提供給用戶。但整個網絡應用程序本身通常使用一個數據庫用戶名/密碼來訪問/與數據庫交互。此數據庫用戶名通常因安全原因具有高度限制的權限。例如,您不希望用戶執行模式操作或刪除記錄,而只是將現有記錄標記爲已刪除記錄,因此您通常只需爲具有罕見Delete特權的Web應用程序選擇,插入和更新特權即可。
Web應用程序常常使用相同的數據庫用戶名/連接的另一個原因是,在多進程/線程環境中嘗試利用數據庫連接池打開數據庫連接並將其重新放回池中的可用連接。如果每個用戶都有自己的連接,他將不得不啓動,那麼您將遇到嚴重的問題擴展,因爲您將爲每個用戶開放一個到數據庫的連接連接,並且無法重用用戶之間的現有連接。
如果你能澄清你的需求一點,也許我們可以想出一個更好的解決方案。
儘管Rails使用單一證書來打開數據庫,但我沒有看看之後對MySQL的身份驗證方案的「吸引力」有什麼根本不同,而不是我創建的模式表。至於澄清要求,我們的用戶現在通過phpMyAdmin在我們的服務器上訪問他們的數據庫。我沒有給他們提供完整的,自由形式的查詢功能,而是創建了一些基於Javascript的圖形和查詢頁面,爲他們提供必要條件。我只是試圖圍繞這些頁面創建一個Web應用程序來控制權限。 – 2012-03-21 19:09:53
- 1. Web服務授權認證
- 2. SOA服務認證/授權
- 3. mysql:具有授權選項的數據庫特定用戶權限委託
- 4. Spring Security - 具有默認權限的數據庫授權?
- 5. MYSQL:授予權限給所有的用戶對數據庫
- 6. 對選定的mysql數據庫的備份授權權限
- 7. 授予數據庫用戶權限
- 8. 授予MySQL用戶有限權限
- 9. 授權:用戶權限VS服務的權利
- 10. MySql授予用戶權限
- 11. MySQL授予用戶權限
- 12. 授權用戶從MySQL數據庫
- 13. Cas認證和數據庫授權
- 14. 如何將用戶添加到數據庫並授權用戶
- 15. 授予所有用戶mysql的權限?
- 16. 哪種授權類型用於客戶端 - 服務器認證?
- 17. 如何將權限/授權數據傳遞給客戶端Javascript?
- 18. Thinktecture身份認證服務器vs授權服務器
- 19. Java認證,授權服務(JAAS)
- 20. WCF服務安全認證和授權
- 21. 微服務 - IPC認證/授權
- 22. 網絡服務安全認證/授權
- 23. MySQL默認用戶權限
- 24. PHP PDO創建MySQL數據庫和用戶,並授予權限
- 25. 如何爲用戶授予遠程訪問mysql服務器的權限?
- 26. 如何在MySQL中授予用戶特定的權限?
- 27. 授權服務器
- 28. 如何授予MySQL服務器管理權限(SUPER,RELOAD ...)與否?
- 29. WCF服務:如何授權用戶
- 30. 將權限和授權邏輯放在數據庫中
從[這裏]拉取信息(http://stackoverflow.com/questions/34490/how-do-i-create-a-sha1-hash-in-ruby),我看到我可以散列給定的密碼通過'require'digest'來匹配mysql.user表; Digest :: SHA1.hexdigest(Digest :: SHA1.digest('password'))',我應該這麼難嗎... – 2012-03-21 19:49:17