我们公司由于加了很多需求,需要创建两个用户表,但是springsecurity默认是只支持一张表验证的,我也没有使用SpringSecurity搞过两张表实现登录验证的,于是在网上找资料。
说到多表登录,这个解决过程是真的尖酸,我在网上翻烂了,也没有找到一个又说到如何解决SpringSecurity如何解决多表登录的问题的,都是扯东扯西,真的挺浪费时间的。
一、 登录
这里我们现将两张表分别取个名字(1. 管理员表 2. 用户表)
1. 第一次登录
第一次登录我是用的 自定义的 loadUserByUsername 方法通过账号对管理员表进行登录验证,
自定义的 getUsername方法通过账号对用户表进行登录验证。
登录的话是没有任何问题的,但是我忘记了一个问题,他是可以登录,无法获取当前用户信息,
因为用户每次调用接口都需要进入JWT 登录授权过滤器进行过滤,我们无法判断是那张表进入的,
我使用的是用户表进行登录的,因为我们获取用户信息获取的是管理员表中的信息,
然后在获取用户信息的时候报类型转换错误,
2. 第二次登录
第二次登录用的是redis进行缓存,
@Resource
private RedisTemplate redisTemplate;
用户表存入的格式是
redisTemplate.opsForValue().set(username+“user”,“user”);
管理员表存入的格式是
redisTemplate.opsForValue().set(username+“admin”,“admin”);
跟上面一样,因为用户每次调用接口都需要进入JWT 登录授权过滤器进行过滤,我们无法判断是那张表进入的,
我使用的是用户表进行登录的,因为我们获取用户信息获取的是管理员表中的信息,
然后在获取用户信息的时候报类型转换错误,
这个方式的话如果两张表里面有两个一样的账号就会两个都进入,那么你这个如果是用户表登录,两张表都存在这个账号的话,你就无法判断它会进入到用户表还是管理员表去查找信息,那么你获取的个人信息就不准确,
在获取用户信息的时候报类型转换错误,(注意:这种方法需要防重,防止两张表账号有一样的)
3. 第三次登录
第三次登录这次我做了想了许多,竟然这些方法都不行,然后我想在使用jwt生成token令牌的地方下手,看下能不能找到突破口,然后我又看了jwt工具类,就开始行动了,想在只能在生成token的时候在username上加点东西,然后就在用户表上面 user.setUsername(username + “user”); 设置用户表账号+user判断是用户表进行的操作,在用户表上面 user.setUsername(username + “admin”); 设置管理员表账号+admin判断是管理员表进行的操作
3.1 用户表登录
3.2 管理员表登录
3.3 Jwt生成token规则
3.4 jwt登录过滤器
我们使用过滤器通过用户表或者管理员表提取出来用户名(这里我们就可以判断是哪个表的用户进行的接口调用)
3.5 Jwt验证token是否有效
然后在Jwt工具类验证token是否有效方法进行校验修改,把账号提取出来(通过用户表或者管理员表进行账号提取,然后通过刚才jwt生成token的规则,我们用来校验,通过账号,过期时间判断token是否过期,过期就需要重新登录,或者续期)
至此我们使用SpringSecurity实现多表登录就成功了。