2013-01-08 180 views
0

我已经实现了一个自定义身份验证方案,它使用一个筛选器,在所有控制器的before拦截器中的AuthService上调用authenticate()方法。 authenticate()方法使用groovy.sql.SqlUserCredentialsDataSourceAdapter尝试连接到数据库,然后检查以确保数据库用户具有适当的角色。数据库是Oracle,是传统ERP的一部分,所以这是我可以进行身份​​验证的唯一方式。HTTP 500响应每秒请求

当我使用无效凭证提交请求时,会出现我遇到的问题。包含"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

我在代码中没有看到任何错误。用户名和密码来自哪里?也许有问题。 –

+0

正在从params地图收集用户名和密码并将其传递给authenticate方法。在我看来,框架正在捕获SQLException并将其保存到下一个请求。不过,我不明白底层框架。 – Stuporman

+0

我认为dataSource是应用程序的单例,因此在设置此不正确的用户名和密码后,第一次尝试获取连接(通过任何地方)将导致无效的用户名和密码。所以当发生异常时,您必须回到默认的用户名和密码。 –

回答

1

我认为该数据源是应用程序单身,所以在第一次尝试你设置这个不正确的用户名和密码将达到无效的用户名和密码后,获取连接(通过任何地方)。

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

+0

这可以通过在上面的代码的catch块中调用'dataSource.removeCredentialsFromCurrentThread()'来完成。 – Stuporman