我正在对临时用户的 Oracle 数据库使用 Spring 身份验证。这些用户将被分配一个数字 ID,他们可以使用该数字 ID 登录受限网站。一切正常,但我只知道用户有时会输入用户名而不是他们的数字 ID(我在测试时自己完成了!)。由于我正在验证的数据库列是一个数字,我得到一个丑陋的 HTTP 状态 401 页面,并带有一个 SQLSyntaxErrorException 说他们输入的是一个无效的数字(它是)。
有没有办法优雅地处理这个问题?例如,Spring 有一个 ExceptionMappingAuthenticationFailureHandler,它允许您将各种类型的身份验证异常映射到网页,以便您可以将用户重定向到有意义的错误页面,我们目前正在使用它来处理 BadCredentialsException 之类的事情。不过,您似乎不能在这里只使用任何旧类型的异常,因为我尝试添加 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 处理程序。
提前致谢!