0

我正在对临时用户的 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 处理程序。

提前致谢!

4

1 回答 1

2

而不是处理将字符串与数字进行比较的异常,您应该在它得到验证之前处理它。可能的选项是:

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

  2. 修改您UserDetailsService以拒绝使用非数字用户名加载用户的尝试。UsernameNotFoundException如果用户名无效,让它抛出一个。

  3. 纯粹在客户端拒绝登录尝试——这通常是个坏主意,因为这样的事情真的应该发生在服务器端。如果无法修改服务器端,我只建议这样做。仅供参考,这只是登录表单提交之前的一些 Javascript 正则表达式验证。这在大多数情况下应该可以工作,但如果客户端禁用了 Javascript ,它将无法工作。

于 2013-05-22T00:04:06.870 回答