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

SpringSecurity配置(自定义认证过滤器)

文末有本篇文章的项目源码文件可供下载学习

在这个案例中,我们已经实现了自定义登录URI的操作,登录成功之后,我们再次访问后端中的API的时候要在请求头中携带token,此时的token是jwt字符串,我们需要将该jwt字符串进行解析,查看解析后的User对象是否处于登录状态.登录状态下,将用户信息封装成Authentication对象用于后续过滤器验证,并放行,未登录状态下直接拒绝访问.

0.配置思路

  1. 在本案例基础上,进行升级.
  2. 新建JwtAuthenticateFilter.java,实现认证过滤器.
  3. 配置SecurityConfig.java,将JwtAuthenticateFilter加入过滤器链.
  4. 进行相关测试.

1.新建JwtAuthenticateFilter.java

@Component
public class JwtAuthenticateFilter extends OncePerRequestFilter {

    @Autowired
    private UserMapper userMapper;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//        1.获取token
        String token = request.getHeader("token");
        if (!StringUtils.hasText(token)) {
            filterChain.doFilter(request, response);
            return;
        }
//        2.解析token
        Claims claims = JwtUtil.parseJWT(token);
        String userId = claims.getId(); //获取用户Id
        String userDetailsString = claims.getSubject();
        UserDetailsImpl userDetails = JSON.parseObject(userDetailsString, UserDetailsImpl.class);
//        3.获取用户信息
        User user = userMapper.findById(userId);
        if (Objects.isNull(user) || user.getCurrentFlag().equals("logout")) {
            throw new RuntimeException("用户未登录");
        }
//        4.存入SecurityContextHolder
        //获取权限信息封装到authenticationToken对象中
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails,null,null);
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//        5.放行
        filterChain.doFilter(request, response);
    }
}

2.配置SecurityConfig.java

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
//                关闭csrf
                .csrf().disable()
//                不通过session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
//                放行登录接口,允许匿名访问
                .antMatchers("/security/login").anonymous()
//                登录不登录的都可以访问,放行
//                .antMatchers("/hello").permitAll()
//                除上面外的所有请求全部需要认证授权
                .anyRequest().authenticated();

//        配置认证jwt过滤器
        http.addFilterBefore(jwtAuthenticateFilter, UsernamePasswordAuthenticationFilter.class);

    }

3.相关测试

3.1未登录测试

我们发现返回403状态码,被拒绝访问.

3.2登录之后访问测试

我们发现返回了token值,将token值复制下来,放到自定义访问的请求头中,之后进行访问测试.

我们发现就能正常访问了.

本篇文章的项目源码文件,可点击下载学习

相关文章:

  • 基于deepseek的智能语音客服【第三讲】知识库封装
  • Rust会取代Java吗?Rust与Java对比
  • 【商城实战(49)】解锁小程序端适配与优化,让商城飞起来
  • druid开启防火墙之后的bug
  • 【MySQL】架构
  • 从基础到实践(十九):DC/DC由来和工作原理介绍
  • 数据源支持远程Excel/CSV,数据集支持分组字段功能,DataEase开源BI工具v2.10.6 LTS版本发布
  • YOLO11报错:AttributeError: module ‘torch‘ has no attribute ‘OutOfMemoryError‘
  • Pytorch使用手册—自定义函数的双重反向传播与自定义函数融合卷积和批归一化(专题五十二)
  • 蓝桥杯算法分享:征服三座算法高峰
  • TensorFlow 的基本概念和使用场景
  • 该错误是由于`KuhnMunkres`类未定义`history`属性导致的
  • 【橘子websocket】如何基于vertx来构建websocket聊天室(上)
  • JS—原型与原型链:2分钟掌握原型链
  • 《AI大模型开发笔记》——企业RAG技术实战
  • 【杂记二】git, github, vscode等
  • 2025火狐插件被禁用解决方案 could not be verified for use in Firefox and has been disabled
  • 用ASCII字符转化图片
  • Linux怎样源码安装Nginx
  • 论文学习11:Boundary-Guided Camouflaged Object Detection
  • 金隅集团:今年拿地将选择核心热门地块,稳健审慎投资
  • 好未来:2025财年收入增长51%,下个财年提高整体盈利能力是首要任务
  • 贵州赤水被指“整改复耕”存形式主义,当地部署耕地流出整改“回头看”
  • 沈阳市委常委马原出任阜新市委副书记、市政府党组书记
  • 潘功胜:央行将实施好适度宽松的货币政策,推动中国经济高质量发展
  • 证券时报:落实“非禁即入” ,让创新活力充分涌流