其他错误:org.apache.shiro.authc.AuthenticationException

来源:互联网 发布:vb.net web开发教程 编辑:程序博客网 时间:2024/06/05 13:30

前言

博主今天遇到了一个惊天大bug!原本我的代码是没有问题的,但是当我把mybatis的数据库连接配置从本地改为远端测试库之后,登录便会报错。使用Navicat可以远程连接数据库!mybatis的连接配置也没有问题,Tomcat服务器可以正常启动!项目框架是spring+spring MVC+mybatis。

一、登录账号报其他错误:org.apache.shiro.authc.AuthenticationException

网上查询资料很多是说身份验证或者权限校验等等有问题。但是博主敢肯定我的代码是没有问题的,因为使用本地库的时候能够正常操作!所以身份验证和权限校验等配置不会有问题。

二、控制台报错

由于不确定是不是登录的时候执行语句有问题,所以我将查询语句打印在控制台。要在mybatis的configuration.xml配置文件中加上<setting name="logImpl" value="STDOUT_LOGGING" />,这样sql语句就能在控制台显示出来。

这里写图片描述

可以看到报错有两个,我对这两种报错都进行了查询
1.报错:SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7f81277b] was not registered for synchronization because synchronization is not active
参考这篇博客,有人说是com.alibaba.druid 连接池引起的,版本问题。正好下面一行报错就是关于com.alibaba.druid 连接池的。
2.报错: [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@d587fe4] will not be managed by Spring
参考这篇博客,有人说是Spring没有去管理数据库的事务,但是我用本地库都是正常的,所以spring或者spring MVC的配置都是正确的。
既然这两条报错信息的解决办法都不是我想要的,那么接着往下看控制台的打印语句,是sql语句。完整的sql语句是:
==> Preparing: select USER_ID as userId, USER_NAME as username, PASSWORD as password, ADMINISTRATOR as administrator, PASSWORD_CHANGED as passwordChanged from T_SC_ADMIN_USER WHERE USER_NAME = ?
==> Parameters: admin(String)

但是在输入admin参数进行查询之后竟然关闭了会话!正常的查询结果应该如下:

<==    Columns: userId, username, password, administrator, passwordChanged<==        Row: 1, admin, e10adc3949ba59abbe56e057f20f883e, 1, 1<==      Total: 1

问题到了这里就比较明了了,应该是sql查询出现了问题。我将那行select语句放入Navicat里,将‘admin‘替换?,进行查询,结果是[Err] 1146 - Table '数据库.T_SC_ADMIN_USER' doesn't exist(默认在表前加上了数据库名称,不知为何)。也就是说我的表不存在,但那是不可能的!我的数据库中有t_sc_admin_user这张表,唯一的区别就是大小写。我将表名改成小写,查询成功!又测试了其他几条sql语句,结果一样!大写出错,小写成功。
现在问题已经找到了,就是表名大小写造成的。使用mysql的表名/字段名/字段值是否区分大小写这篇博客里的方法,在Navicat分别在本地库和远端库的新建查询运行show Variables like '%table_names'语句,得出的结果分别是1和0。也就是说我本地数据库是不区分大小写而远端库是区分大小写的。我去问了建远端库的同事,由于是在Linux上建立的,所以默认是区分大小写。到现在,问题解决了,就是MySQL数据库区分了大小写导致查询失败!,只需要把远端库修改成不区分大小写就可以了。

结语

有的时候运行代码报错并不一定是报错语句的那个意思,需要找到更深层的原因。像这里报错是org.apache.shiro.authc.AuthenticationException,但其实是登录的时候查询语句出错,而出错原因则是MySQL数据库区分大小写。

阅读全文
0 0
原创粉丝点击