2013-01-08 229 views
0

我已經實現了一個自定義身份驗證方案,它使用一個篩選器,在所有控制器的before攔截器中的AuthService上調用authenticate()方法。 authenticate()方法使用groovy.sql.SqlUserCredentialsDataSourceAdapter嘗試連接到數據庫,然後檢查以確保數據庫用戶具有適當的角色。數據庫是Oracle,是傳統ERP的一部分,所以這是我可以進行身份​​驗證的唯一方式。HTTP 500響應每秒請求

當我使用無效憑證提交請求時,會出現我遇到的問題。包含"ORA-01017: invalid username/password; logon denied"的SQLException按預期拋出。我的try/catch塊捕獲並禁止它,代碼正確地繼續拒絕請求。但是,無論提供的憑據如何,下一個請求總是以500響應返回SQLException。任何想法,爲什麼這是我能做些什麼來解決它?

def authenticate(def username, def password) { 
    def authorized = false 
    Sql sql 

    if (username != null && !username.equals('')) { 
     try { 
      dataSource.setCredentialsForCurrentThread(username, password) 

      sql = Sql.newInstance(dataSource) 
      def row = sql.firstRow("**SQL removed for privacy**") 

      if (row != null && row.has_permission == 1) { 
       authorized = true 
      } 
     } catch (Exception e) { 

     } finally { 
      sql.close() 
     } 
    } 

    return authorized 
} 
+0

我在代碼中沒有看到任何錯誤。用戶名和密碼來自哪裏?也許有問題。 –

+0

正在從params地圖收集用戶名和密碼並將其傳遞給authenticate方法。在我看來,框架正在捕獲SQLException並將其保存到下一個請求。不過,我不明白底層框架。 – Stuporman

+0

我認爲dataSource是應用程序的單例,因此在設置此不正確的用戶名和密碼後,第一次嘗試獲取連接(通過任何地方)將導致無效的用戶名和密碼。所以當發生異常時,您必須回到默認的用戶名和密碼。 –

回答

1

我認爲該數據源是應用程序單身,所以在第一次嘗試你設置這個不正確的用戶名和密碼將達到無效的用戶名和密碼後,獲取連接(通過任何地方)。

所以當發生異常時,您必須回到默認的用戶名和密碼。

+0

這可以通過在上面的代碼的catch塊中調用'dataSource.removeCredentialsFromCurrentThread()'來完成。 – Stuporman