对于临时用户,我对Oracle数据库使用Spring身份验证。这些用户将被分配一个数字ID,他们可以使用该ID登录有限的网站。一切都很正常,但我只知道用户在某些时候会输入用户名而不是他们的数字ID (我在测试时就自己做过了!)。因为我要验证的数据库列是一个数字,所以我得到了一个丑陋的HTTPstatus401页面,其中包含一个SQLSyntaxErrorException,说明他们输入的是一个无效的数字(事实确实如此)。
有没有办法优雅地处理这个问题?例如,Spring有一个ExceptionMappingAuthenticationFailureHandler,它允许您将各种类型的身份验证异常映射到web页面,以便您可以将用户重定向到有意义的错误页面,我们目前正在将其用于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处理程序了。
提前感谢!
发布于 2013-05-22 08:04:07
而不是处理字符串与数字进行比较的异常,您应该在它得到验证之前处理这个问题。可能的选项包括:
UserDetailsService以拒绝使用非数字用户名加载用户的尝试。如果用户名无效,让它抛出一个UsernameNotFoundException。https://stackoverflow.com/questions/16681345
复制相似问题