1.前端向后端发送/login登录请求,发送json数据。JSON数据中包含(username,password,code,uuid。
后端的login接口进行处理
2.后端调用loginService的login() 方法进行用户登录校验。
loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
验证码校验通过 uuid从redis中取出验证码谜面和传过来的code进行对比。通过后进行用户名字和密码 校验,不通过记录下登录日志,抛出验证码异常。
登录认证使用了springsecurity框架+jwt 在SecurityConfig中配置相关信息。
注入AuthenticationManager
authentication = authenticationManager.authenticate(authenticationToken);该方法会去调用UserDetailsServiceImpl.loadUserByUsername从数据库中加载用户信息
通过认证后,会将用户的信息和权限列表存到redis中,key为随机生成的uuid,将uuid转化成token,返回给前端
用户之后的每次请求都会在请求头中带上token。
而JwtAuthenticationTokenFilter这个过滤器会拦截每一次请求,从请求中获取登录用户信息。从请求中获取token,然后从token中解析出uuid,根据uuid从redis中获取用户信息。
判断用户信息不为空并且SecurityUtils.getAuthentication()为空,刷新redis有效期。然后创建一个新的UsernamePasswordAuthenticationToken,把用户和权限填充进去。这个构造器会设置认证状态为true
然后把authenticationToken填充到SecurityContextHolder中,然后放行。
之后就可以从SecurityContextHolder获取用户信息和权限。
比如getinfo请求