2012-03-21 10 views
2

我們有一個MySQL數據庫服務器,裏面有數十個數據庫。我們在控制對各種數據庫的訪問的服務器中有很多用戶帳戶。我想將Rails應用綁定到這些預先存在的帳戶中。我可以找到的每個認證系統(迄今爲止其中的4個)假定我將創建專用於「用戶」模型的表格。我只想使用mysql.user表進行身份驗證,並使用mysql.db表進行授權。有沒有可以使用「真正的」MySQL特權系統的Rails認證系統,而不是在數據庫的TOP上放置一個?這甚至是可取的嗎?如果我必須自己編碼,那麼有沒有人預見到這種方法存在困難?如何將Rails用戶認證/授權綁定到MySQL數據庫服務器中的現有權限?

+0

從[這裏]拉取信息(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

回答

0

所以我看到了這個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使用的完全相同類型的密碼哈希,並將該哈希(提供的密碼)與該用戶的數據庫中的哈希進行比較。如果他們是平等的,那是一個認證登錄。

0

總之:您的要求是非常異國情調。通常,Web應用程序爲其用戶提供認證/授權系統,允許他們定義角色並將這些角色提供給用戶。但整個網絡應用程序本身通常使用一個數據庫用戶名/密碼來訪問/與數據庫交互。此數據庫用戶名通常因安全原因具有高度限制的權限。例如,您不希望用戶執行模式操作或刪除記錄,而只是將現有記錄標記爲已刪除記錄,因此您通常只需爲具有罕見Delete特權的Web應用程序選擇,插入和更新特權即可。

Web應用程序常常使用相同的數據庫用戶名/連接的另一個原因是,在多進程/線程環境中嘗試利用數據庫連接池打開數據庫連接並將其重新放回池中的可用連接。如果每個用戶都有自己的連接,他將不得不啓動,那麼您將遇到嚴重的問題擴展,因爲您將爲每個用戶開放一個到數據庫的連接連接,並且無法重用用戶之間的現有連接。

如果你能澄清你的需求一點,也許我們可以想出一個更好的解決方案。

+0

儘管Rails使用單一證書來打開數據庫,但我沒有看看之後對MySQL的身份驗證方案的「吸引力」有什麼根本不同,而不是我創建的模式表。至於澄清要求,我們的用戶現在通過phpMyAdmin在我們的服務器上訪問他們的數據庫。我沒有給他們提供完整的,自由形式的查詢功能,而是創建了一些基於Javascript的圖形和查詢頁面,爲他們提供必要條件。我只是試圖圍繞這些頁面創建一個Web應用程序來控制權限。 – 2012-03-21 19:09:53