登录不区分大小写的Bug
核心依赖如下
| ---------------------- |----------|
| Spring Boot | 2.6.2 |
| Spring Cloud | 2021.0.0 |
| Spring Cloud Alibaba | 2021.1 |
| Spring Security OAuth2 | 2.3.6 |
| Mybatis Plus | 3.5.0 |
开发环境如下:
| 工具 | 版本 | 备注 |
| ------- | ------- | ------------------------ |
| JDK | 1.8 | 强制要求 |
| Mysql | 5.7.8 + | 强制要求 |
| Redis | 3.2 + | |
| node.js | 14 | 不要使用16 |
| IDE | IDEA | 2019+,安装lombok plugin |
测试提出的bug如下,前台无论输入大小写的用户名都可以进行登录
数据表建立规则如下:
utf8_general_ci,这个的意思是忽视大小写,也就是说对于数据库来说大小写都是一样的。定位了原因,我觉得分为两种三种解决原因。
-
查询时间加上binary
BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写。
mysql> select binary 'ABCD'='abcd' COM1, 'ABCD'='abcd' COM2; +--------+-----------+ | COM1 | COM2 | +--------+-----------+ | 0 | 1 | +---------+-----------+ 1 row in set (0.00 sec) -
创建数据库时候直接指定
create table table_name { 字段 varchar(32) binary; } -
如果已经上线了,直接修改字段
ALTER TABLE `sys_user` MODIFY COLUMN username VARCHAR(64) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;
注意:若用户信息缓存有在redis,解决完成需要清除redis的缓存用户信息。