配置Security来进行JWT登录

配置一下SecuritConfiguration 直接在 UsernamePasswordAuthenticationFilter 之前加入请求鉴权要创建的 JwtAuthenticationFilter 类,同时Ban掉Session校验:

				.sessionManagement(conf->{  
                    conf.sessionCreationPolicy(SessionCreationPolicy.STATELESS);  
                })                
                .formLogin(conf-> {  
                    conf.loginProcessingUrl("/api/auth/login");  
                    conf.successHandler(authenticationSuccessHandler);  
                    conf.failureHandler(authenticationFailureHandler);  
                }) 
                .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)

这两个Handler就是一会要写的。

旧版本 springSecurity 6 以下: 通过在构造方法中使用 AntPathRequestMatcher来添加对应的解析路径,所有客户端访问该请求都会先调用security的鉴权,并切换到自定义的attemptAuthentication方法中进行判空后,调用security原本的判断链继续进行实际判断(比如进入UserDetailsService)。

处理结果

如果登录成功,那么就返回给原本一个json对象,包含根据用户名进行加密的JWToken。 首先我们先添加 Response工具类ResultUtil 工具类,前者用于快速封装一个json对象来返回,后者用于封装对response进行调用,并返回对应的response。

接着自定义创建一个 RestAuthenticationSuccessHandler 类,放在Handler包中,用于接管 springsecurity 来对响应成功的请求进行处理,使用上述两个工具类返回由username构成的JWToken。

当然,都处理成功的了,肯定也要处理失败的,继续创造一个 RestAuthenticationFailureHandler 类,处理失败的请求。 那么当登录请求进来时,就可以在接入自定义全局异常处理的情况下进行符合接口响应格式的返回json回复,并且当登录成功时创建对应的Token并返回。

效果:

添加Filter来对所有请求鉴权

通过创建一个 JwtAuthenticationFilter 类 来配置对某个路径的JWT鉴权。核心验证思路就是通过 HttpServletRequest 来获取 Header 中的 Authentication 字段的值,这部分在前端要设置成存放 Token。先判断有没有,然后再用 Jwt工具类 来进行解析 Token并验证。