乌鲁木齐网站建设求职简历上海网站推广服务
原因
情形1:数据库存储的密码,密文对应的明文密码不是admin和123456。
情形2:数据库admin的密码之前如果登录成功,修改了数据库的密码之后,再次以数据库修改后的密码登录,会失败!!!
排查方法如下:
step1:
打印校验密码前后的密码,看是否是因为拿到的密码不对。
step2:发现校验前后的密码是一致的,此时需要查看数据库中存储的密码是否和这里umsAdmin.getPassWord()查到的一致。
下图是代码中校验语句前后的密码:
下图是数据库存储的密码:
结果发现,和数据库中的密码不一致,说明没有用数据库中的密码作为密码校验。所以一定是redis缓存中的数据和数据库存储的密码不一致。
下图是redis中通过key查询到的密码:和数据库存储的果然不一致。
step3:通过代码验证问题所在。确实是因为当用户登录时,首先会在redis中通过用户名来查询缓存记录中的密码,如果存在这条记录,就用缓存中的密码作为校验的正确值;否则才去查询数据库。
做法如下:
找到login对应的service实现类,这里有一个loadUserByusername,进入这个方法。
step4:进入这个方法,里面是通过username拿到的登录用户对象。
这个getAdminByUsername首先通过查缓存中是否有这个对象的信息。如果有,就用缓存中的对象(包括用户名和密码)作为校验的真实值;缓存中没有的话才去数据库查询当前用户登录需要的正确密码。
解决方法:
对于情形1:利用BCrypt自己生成一个明文密码对应的密文,并修改到数据库,同时清空redis对于这个用户key的缓存记录。
对于情形2:删除redis里这个用户名作为key的缓存记录即可。