Spring Security 6+MySQL 8:groups保留关键字致JdbcUserDetailsManager异常
MySQL 8.0与Spring Security JdbcUserDetailsManager的关键字冲突问题
问题背景
MySQL 8.0已将groups列为保留关键字,但Spring Security默认的JdbcUserDetailsManager实现未对表名groups做反引号转义,执行SQL时会抛出异常。例如默认的重命名组SQL语句如下:
public static final String DEF_RENAME_GROUP_SQL = "update groups set group_name = ? where group_name = ?";
现有规避方案
目前通过重新定义所有相关SQL,并新建user_groups表来绕过问题,但想了解是否有更优方案,或是应该在Git上提交issue。
更优解决方案
1. 重写默认SQL(无需改表结构)
不用新建表,直接继承JdbcUserDetailsManager,在自定义实现里替换所有涉及groups表的SQL,给表名加上反引号。比如重命名组的SQL可修改为:
public static final String DEF_RENAME_GROUP_SQL = "update `groups` set group_name = ? where group_name = ?";
通过调用setRenameGroupSql()、setFindGroupsSql()等方法,逐一替换默认SQL即可,这种方式更贴合原有表结构,改动最小。
2. 配置MySQL兼容模式
在MySQL连接URL中添加sessionVariables=sql_mode='ANSI_QUOTES',开启后MySQL会将双引号视为标识符引号,此时可把原SQL中的groups替换为"groups"。不过这种方式可能影响项目中其他SQL的写法,需要提前测试兼容性。
关于提交Issue的建议
这个问题属于Spring Security对MySQL 8.0的兼容性遗漏,建议在Spring Security的官方Git仓库提交Issue。提交时需包含:
- MySQL 8.0将
groups列为保留关键字的背景 - JdbcUserDetailsManager默认SQL未转义表名导致的异常信息
- 示例SQL及报错截图(如有)
官方通常会在后续版本中对涉及数据库保留关键字的表名添加转义处理,帮助更多开发者避免同类问题。
内容的提问来源于stack exchange,提问作者jden
相关产品推荐
相关产品推荐

