Spring数据库身份验证异常处理?

时间:2013-05-21 23:50:43

标签: spring spring-security

我正在为临时用户使用针对Oracle数据库的Spring身份验证。将为这些用户分配一个他们可以用户登录有限网站的数字ID。一切都运行正常,但我只知道用户将在某个时候键入用户名而不是他们的数字ID(我在测试时自己完成了!)。由于我正在进行身份验证的数据库列是一个NUMBER,因此我得到一个带有SQLSyntaxErrorException的丑陋的HTTP状态401页面,说明他们输入的内容是一个无效的数字(它是)。

有没有办法优雅地处理这个问题?例如,Spring有一个ExceptionMappingAuthenticationFailureHandler,它允许您将各种类型的身份验证例外映射到网页,以便您可以将用户重定向到有意义的错误页面,我们目前正在使用它来处理BadCredentialsException之类的事情。看来你不能在这里使用任何旧类型的excpetion,因为我尝试添加java.sql.SQLSyntaxErrorException并且它没有改变任何东西。是否有类似的Spring类允许您捕获其他类型的异常?或者我只是没有正确配置?这就是我所拥有的:

<bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler>
   <property name="exceptionMappings">
      <props>
         <!-- The Spring exception types all work fine... -->
         <prop key="org.springframework.security.authentication.BadCredentialsException">
            /login/Bad Credentials
         </prop>
         <prop key="org.springframework.security.authentication.CredentialsExpiredException">
            /login/Expired Credentials
         </prop>
         <prop key="org.springframework.security.authentication.LockedException">
            /login/Account Locked
         </prop>
         <prop key="org.springframework.security.authentication.DisabledException">
            /login/Account Disabled
         </prop>
         <!-- ...But this one doesn't do anything! -->
         <prop key="java.sql.SQLSyntaxErrorException">
            /login/Use Numeric ID
         </prop>
      </props>
   </property>
 <bean>

我真的想将我的数据库列定义为数字。一个简单的解决方案是将其设为VARCHAR,但只将数字数据放入其中,但这有点难看。有一个统一的方法来处理所有身份验证异常也很好,我们已经在使用Spring处理程序了。

提前致谢!

1 个答案:

答案 0 :(得分:2)

除了处理字符串与数字进行比较的例外情况之外,你应该在它被验证之前处理这个问题。可能的选择是:

  1. 修改登录控制器以拒绝尝试使用非数字用户ID登录。如果您在Spring Security中使用内置控制器,这可能比选项#2更加痛苦。

  2. 修改UserDetailsService以拒绝尝试加载具有非数字用户名的用户。如果用户名无效,请抛出UsernameNotFoundException

  3. 完全拒绝客户端上的登录尝试 - 这通常是一个坏主意,因为这样的事情确实应该发生在服务器端。我只建议修改服务器端是不可能的。仅供参考,这只是在登录表单提交之前的一些Javascript正则表达式验证。这应该适用于大多数情况,但如果客户端禁用了Javascript,它将工作。