当前位置: 首页 > news >正文

安徽合肥建设局网站百度正式员工工资待遇

安徽合肥建设局网站,百度正式员工工资待遇,做电影网站采集什么意思,西安网站建设报价方案前面我们实现了给客户端下发token,虽然客户端拿到了token,但我们还没处理客户端下一次携带token请求时如何验证,我们想要实现拿得到token之后,只需要验证token,不需要用户再携带用户名和密码了。 1. 禁用 UsernamePass…

前面我们实现了给客户端下发token,虽然客户端拿到了token,但我们还没处理客户端下一次携带token请求时如何验证,我们想要实现拿得到token之后,只需要验证token,不需要用户再携带用户名和密码了。



1. 禁用 UsernamePasswordAuthenticationFilter



在这里插入图片描述

由上图可以看出,当用户访问了相关路径之后,Spring内部会自己创建一个UsernamePasswordAuthenticationFilter给我们,现在我们不想通过username和password进行认证了,我们想通过token进行验证,那就需要把内部创建的UsernamePasswordAuthenticationFilter给禁用了。

添加formLogin().disable到过滤链中:


在这里插入图片描述


为什么添加了这行代码就禁用了那个东西了呢?这是因为如果不禁用formLogin,它就会创建一个UsernamePasswordAuthenticationFilter


2. 创建自己的认证过滤器


禁用了UsernamePasswordAuthenticationFilter之后,我们就需要创建自己的过滤器,并把它添加到过滤链中,我们的验证过程就是在我们自己编写的过滤器中进行

在这里插入图片描述

@Slf4j
@Component
public class JWTAuthenticationFilter extends OncePerRequestFilter {@ResourceRedisTemplate redisTemplate;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {//如果是要登录,放行到登录页面if("/login2".equals(request.getRequestURI())){filterChain.doFilter(request, response);return;}//不是进行登录,说明前端会携带tokenString token = request.getHeader("Authorization");if(StrUtil.isEmpty(token))throw new RuntimeException("token 为空");//token类型:postman前端传来的token会在前面加一个类型和一个空格if(!StrUtil.startWith(token, "Bearer"))throw new RuntimeException("token 类型错误");//1. 验证tokentoken = token.substring(7);JWTSigner jwtSigner = JWTSignerUtil.hs512("testttttt".getBytes(StandardCharsets.UTF_8));if (!JWTUtil.verify(token, jwtSigner)) {throw new RuntimeException("token 无效");}//2. 从token中取出用户名String username = (String) JWTUtil.parseToken(token).getPayload().getClaim("username");//3. 根据用户名从redis中取出password(登录时可以将UserDetails存储到redis)String password = (String) redisTemplate.opsForHash().get("user-details", username);if(password == null) throw new RemoteException("token 过期");log.info("--------> get password= {}", password);//4. new一个UserDetails,这个UserDetails会被存储到SecurityContextHolder中MyUserDetails userDetails = new MyUserDetails(new MyUser(1, username, password));//5. 将UserDetails存储到SecurityContextHolder中SecurityContextHolder.getContext().setAuthentication(UsernamePasswordAuthenticationToken.authenticated(userDetails, null, null));filterChain.doFilter(request, response);}
}

注意,代码中的第5步决定是否放行请求,只有将UserDetails存储到SecurityContextHolder中,过滤器才会放行。


将编写好的过滤器添加到过滤器链中:




在这里插入图片描述

.addFilterAt(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);

3. 测试

可以看到,用户首次登录之后,后端成功返回一个token



在这里插入图片描述

接下来携带token请求另一个页面。


在这里插入图片描述


成功返回结果:

在这里插入图片描述


EX++++++++++++++

经过测验发现,放行和不放行完全取决于这行代码:


在这里插入图片描述

SecurityContextHolder.getContext().setAuthentication(UsernamePasswordAuthenticationToken.authenticated(userDetails, null, null));

我甚至可以直接写成

SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, null, null));

因为UsernamePasswordAuthenticationToken.authenticated(userDetails, null, null)这个函数在底层就是会直接new一个UsernamePasswordAuthenticationToken

http://www.yidumall.com/news/46772.html

相关文章:

  • 英文网站模板焦作seo推广
  • 网站建设公司后端招聘要求百度不收录网站怎么办
  • 下载wordpress程序班级优化大师
  • 漫画网站建设教程视频网站优化公司上海
  • 怎么做网站的关键词库广州网站关键词排名
  • 骏域网站建设专家电脑版爱站网长尾关键词挖掘查询工具
  • 网站官方首页设计steam交易链接在哪看
  • 网站建设河南怎样能在百度上搜索到自己的店铺
  • 做网站要切图吗宁波seo排名优化价格
  • 网站站点结构图怎么做seo整站怎么优化
  • 广州市建设集团网站吉林seo关键词
  • 加快网站集约化建设总结seo 0xu
  • 怎样做个网站找客户的十大方法
  • 建设部执业注册网站seo网络科技有限公司
  • 网站构建器比百度好用的搜索软件
  • 科技通信网站模板下载搜狗搜索推广
  • 惠安县住房和城乡建设局网站大数据营销系统怎么样
  • 电子商务网站开发费用seo点击软件
  • 网站建设中怎么编辑图片百度seo排名优化排行
  • 做网站sqlserver排序seo权重优化
  • 用python做web的网站网店代运营收费
  • 建设企业网站的目的以及意义在线域名查询网站
  • 潍坊外贸建站最新app推广
  • 跟有流量的网站做友情链接facebook海外推广
  • 福田蒙派克优缺点seo实战密码电子版
  • 自己做网站代码廊坊网站建设优化
  • 二手商品网站的设计与建设论文楚雄今日头条新闻
  • 上海建设网站的公司青岛谷歌优化
  • 网站制作 万网廊坊网站建设公司
  • 婚纱摄影网站模板怎么做好网站搜索引擎优化