1.登陆校验流程:
登录只有认证,没有鉴权
前端传过来用户名和密码,服务器去数据库中进行校验,正确的话根据用户名id和盐生成一个JWT ,然后把token返回给前端 ,前端 在每次请求中都在请求头 中携带token ,服务器进行token解析 出用户id然后去数据库中查找是否有这个id ,这个id是否有权限,才会允许访问相关资源。
2.认证流程详解:
注意这里的接口,以后会实现接口和重写类
- 提交用户名和密码
- 封装Authentication对象用来装用户名和密码(无认证和权限)
- 调用ProviderManager的authenticate方法进行认证
- 调用DaoAuthentication的authenticate进行认证
- 调用 loadUserByUsername方法 根据用户名查询用户(会继承 UserDetailsService接口 然后重写loadUserByUsername在数据库中查找Username)。
- 通过用户名在数据库中查到一个对象,放入UserDetails对象(数据库查出来的)中
- 比较Userdetails对象的密码和Authentication对象的密码是否一样
- 如果一样就把Userdetails的权限信息设置到Authentication对象中
- 返回Authentication对象
- 使用getContext.setAuthentication来存储认证(Authentication对象)
3.关于token解释:
使用createJWT(用户id);来生成token
使用parseJWT(token);来解析token得出用户id
JWT是盐+用户id生成的token
存储redis的策略:
- 将token当作key,登录对象存放到redis
- 将userid当key,登陆对象当作value,这样每次请求都需要解析
为什么要使用token?
当用户成功登录系统时,服务器会生成一个唯一的 Token 并将其返回给客户端。客户端可以在之后的请求中将该 Token 作为凭证,服务器通过检查 Token 来确认用户的身份。如果不使用token,使用用户id当作登陆凭证,别人很容易模仿 ,所以才使用token,模仿不了token