我已经使用一个过滤器实现了一个自定义身份验证方案,该过滤器在我所有控制器的前拦截器中调用一个authenticate()
方法。AuthService
该authenticate()
方法使用groovy.sql.Sql
UserCredentialsDataSourceAdapter来尝试连接到数据库,然后检查以确保数据库用户具有适当的角色。该数据库是 Oracle 并且是旧版 ERP 的一部分,因此这是我进行身份验证的唯一方法。
当我提交带有无效凭据的请求时,会出现我遇到的问题。"ORA-01017: invalid username/password; logon denied"
按预期抛出包含 an 的 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
}