前端登录不区分大小写

366 阅读1分钟

登录不区分大小写的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如下,前台无论输入大小写的用户名都可以进行登录

image.png 数据表建立规则如下:

image.png

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的缓存用户信息。