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

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值复制下来,放到自定义访问的请求头中,之后进行访问测试.

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

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


http://www.kler.cn/a/596230.html

相关文章:

  • Oracle转化为MySQL数据库
  • 当下主流 AI 模型对比:ChatGPT、DeepSeek、Grok 及其他前沿技术
  • cfca 申请国密证书流程
  • 面试总结之Android Bitmap 深度解析与性能优化
  • 第9章:Docker Compose企业级多容器编排
  • 19.课程发布-freeMarker
  • 读取Table的结构转换为Model类
  • kOps + Karpenter 集成实践:实现 K8s 集群的动态扩展
  • [Vue]条件渲染
  • Python 应用部署云端实战指南 —— AWS、Google Cloud 与 Azure 全解析
  • 基于香橙派 KunpengPro学习CANN(2)——Ascend Extension for PyTorch 配置与安装
  • docker搭建云盘
  • 说一下yolo的一些概念 和 自己对 置信度阈值 和图像处理模板匹配的理解
  • 如何把全局坐标系转到机器人本体坐标系
  • Android数据加密方案
  • 深入解析计算机组成原理:从硬件架构到程序运行的本质
  • 【access开发】导入excel 并生成表
  • Object 转 JSONObject 并排除null和““字符串
  • SpringSecurity——前后端分离登录认证
  • 工作相关记录