我已经实现了一个自定义身份验证方案,它使用一个筛选器,在所有控制器的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是应用程序的单例,因此在设置此不正确的用户名和密码后,第一次尝试获取连接(通过任何地方)将导致无效的用户名和密码。所以当发生异常时,您必须回到默认的用户名和密码。 –