0

我已经使用一个过滤器实现了一个自定义身份验证方案,该过滤器在我所有控制器的前拦截器中调用一个authenticate()方法。AuthServiceauthenticate()方法使用groovy.sql.SqlUserCredentialsDataSourceAdapter尝试连接到数据库,然后检查以确保数据库用户具有适当的角色。该数据库是 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
}
4

1 回答 1

1

我认为 dataSource 是应用程序的单例,因此在您设置此不正确的用户名和密码后第一次尝试获取连接(通过任何地方)时会遇到无效的用户名和密码。

所以当异常发生时,你必须回到默认的用户名和密码。

于 2013-01-09T11:51:30.530 回答