我已经实现了使用过滤器的自定义身份验证方案,该过滤器在我所有 Controller 的拦截器中的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
}
最佳答案
我认为dataSource对于应用程序来说是单例,因此在您设置此错误的用户名和密码后,第一次尝试建立连接(在任何地方)都将击中无效的用户名和密码。
因此,发生异常时,您必须返回默认的用户名和密码。