登录页面无法获取User角色值,Spring Security认证报错,排查数据库结构问题
嘿,我之前也碰到过类似的Spring Security认证时角色为空的问题,结合你说的情况,用户John的role为null还触发了InternalAuthenticationServiceException,大概率是数据库里User与Role的关联环节出了问题。下面是几个数据库结构层面的常见排查方向:
用户角色的关联表缺失或无对应记录
一般User和Role是多对多关系,得靠中间表(比如user_role)来关联两者的主键。如果这个中间表压根没建,或者里面没有John对应的user_id和role_id关联记录,那查询时肯定拿不到角色数据。先检查下有没有这个中间表,以及表中是否存在John的关联条目。关联字段的名称或类型不匹配
比如User表的主键是user_id(INT类型),但中间表的关联字段写成了uid,或者类型是VARCHAR;又或者Role表主键是role_id,中间表却用了rid,这会导致JOIN查询时无法正确关联,最终角色返回null。一定要确保关联字段的名称和数据类型完全一致。Role表中无对应角色数据
就算中间表有John的关联记录,如果Role表中找不到对应的role_id那条数据(比如不小心删了),查询结果里角色也会是null。去Role表里查一下,看是否存在John关联的那条角色记录。外键约束缺失导致脏数据
如果没给中间表的user_id和role_id设置外键约束,很可能出现脏数据(比如中间表存了一个不存在的role_id),导致查询时关联不到有效角色。建议检查外键约束是否正确配置,保证关联数据的有效性。
另外,那个InternalAuthenticationServiceException通常是因为UserDetailsService的loadUserByUsername方法里抛出了未捕获的异常,大概率是查询角色时的空指针或者数据查询异常。你可以在这个方法里加个日志,打印下执行的SQL和查询结果,能更快定位问题。
内容的提问来源于stack exchange,提问作者Tony

