我已經實現了一個自定義身份驗證方案,它使用一個篩選器,在所有控制器的before攔截器中的AuthService
上調用authenticate()
方法。 authenticate()
方法使用groovy.sql.Sql
和UserCredentialsDataSourceAdapter嘗試連接到數據庫,然後檢查以確保數據庫用戶具有適當的角色。數據庫是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
}
我在代碼中沒有看到任何錯誤。用戶名和密碼來自哪裏?也許有問題。 –
正在從params地圖收集用戶名和密碼並將其傳遞給authenticate方法。在我看來,框架正在捕獲SQLException並將其保存到下一個請求。不過,我不明白底層框架。 – Stuporman
我認爲dataSource是應用程序的單例,因此在設置此不正確的用戶名和密碼後,第一次嘗試獲取連接(通過任何地方)將導致無效的用戶名和密碼。所以當發生異常時,您必須回到默認的用戶名和密碼。 –