我已经使用筛选器实现了一个自定义身份验证方案,该筛选器在所有控制器的before拦截器中调用AuthService上的authenticate()方法。authenticate()方法使用groovy.sql.Sql和UserCredentialsDataSourceAdapter尝试连接到数据库,然后进行检查以确保数据库用户具有适当的角色。数据库是Oracle,是遗留ERP的一部分,所以这是我进行身份验证的唯一方法。
当我提交一个带有无效凭据的请求时,我遇到的问题就出现了。正如预期的那样,将抛出包含"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
}发布于 2013-01-09 19:51:31
我认为dataSource是应用程序的单例,所以在您设置了不正确的用户名和密码后,第一次尝试连接(通过任何位置)时,将会遇到无效的用户名和密码。
因此,当异常发生时,您必须恢复到默认用户名和密码。
https://stackoverflow.com/questions/14221327
复制相似问题