我使用过滤器实现了一个自定义身份验证方案,该过滤器在所有控制器的前拦截器中的authenticate()
上调用AuthService
方法。 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
}
答案 0 :(得分:1)
我认为dataSource是应用程序的单例,因此在设置此错误用户名和密码后首次尝试获取连接(通过任何地方)将会出现无效的用户名和密码。
因此,当发生异常时,您必须返回默认用户名和密码。