type
status
date
slug
summary
tags
category
icon
password
主要流程是前端把用户名和密码传到服务器,服务器进行对比,如果校验正确,那么返回给前端一个 token。前端每次访问接口的时候都携带token,从 token 中解析出 userid,查看该用户是否有相关目标的访问权限,根据情况返回响应。

image-20230712162224634
springSecurity 流程
springSecurity 是一连串的过滤器链,通过实现各个过滤器,来达到权限校验的流程。

image-20230713173617502
图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示。
UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。
ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。
FilterSecurityInterceptor:负责权限校验的过滤器。
springSecurity实现自定义用户名和密码校验
创建用户权限实体类,实现UserDetails接口
里面有一个有参构造器,里面存储了用户信息和权限信息。
实现UserDetailsService接口,实现自己的方法,从数据库里面查找用户。
返回的对象也是上一步自己实现的用户类,返回用户信息和权限信息。
加入 JWT
上一步是实现了 springSecurity 中的方法,让 SpringSecurity 帮你调用了方法进行校验,那么如何让我们根据自己的业务逻辑进行调用呢?
这样的话,如果校验通过了,就可以根据用户信息生成 token,响应给前端。
这样的话还需要写一个过滤器,当前端访问接口的时候进行校验 token 的信息。
如果 token 能够正确解析,并且可以从 redis 里访问到,那么就可以认为 token 没问题,然后把权限信息封装到 SpringSecurity 的上下文中,最后放行,否则抛出错误信息。
把定义的 JWT过滤器加入到 SpringSecurity 的最前面即可。