首页 > 其他分享 >接上文实现SpringSecurity,拦截器的实现

接上文实现SpringSecurity,拦截器的实现

时间:2024-09-29 17:50:11浏览次数:7  
标签:httpServletRequest 拦截器 实现 userId SecurityContextHolder SpringSecurity token publ

实现拦截器

有图片可知,在上篇文章我们重写了UserDetailsManager,现在我们来进行之后的操作
在UserDetailsManager中我们可以调动数据库去进行一个账号密码的校验
之后我们这样设置拦截器进行一个token获取存储在usernamePasswordAuthenticationFilter这一层中,
有,则存储在SecurityContextHolder.getContext()中供接下来的调用,没有就放行

@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
    @Autowired
    private RedisCache redisCache;
    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        String token = httpServletRequest.getHeader("token");
        if(!StringUtils.hasText(token)){
            filterChain.doFilter(httpServletRequest,httpServletResponse);
            return;
        }
        String userId="";
        try {
            Claims claims = JwtUtil.parseJWT(token);
            userId = claims.getSubject();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        LoginUser cacheObject = redisCache.getCacheObject("login:" + userId);
        if(Objects.nonNull(cacheObject)){
            UsernamePasswordAuthenticationToken token1=new UsernamePasswordAuthenticationToken(cacheObject,null,null);
            SecurityContextHolder.getContext().setAuthentication(token1);
        }

        filterChain.doFilter(httpServletRequest,httpServletResponse);
    }
}

启用拦截器


@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private  JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new  BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext

                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问
                .antMatchers("/user/login").anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated();
        http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
    }
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}


```,
注意:
1.不用去想着token没有的情况,由以上逻辑可以看出来,我们将token获取后会存入 SecurityContextHolder中,之后的内置拦截器会检测是否有token,没有就报错,不用自己设置监测
2.其次,一定要注意,在拦截器中放生login接口
3.登录前UsernamePasswordAuthenticationToken存的是账号密码,登录后转入 SecurityContextHolder时,存的是对象

标签:httpServletRequest,拦截器,实现,userId,SecurityContextHolder,SpringSecurity,token,publ
From: https://www.cnblogs.com/fubai/p/18440505

相关文章

  • C# Modbus Tcp 实现(二)
    CSocketClientinfo;ModbusMastermaster;//publicstaticModbusTcp2Instance=newModbusTcp2("192.168.0.8",8000);publicstaticModbusTcp2Instance=newModbusTcp2("127.0.0.1",8000);public......
  • C# Modbus Tcp实现(一)
     类CSocketClient主要包括以下内容:privateTcpClient_client;publicThread_connectionThread;privateStreamWriter_write;publicClientRecMsgClassGClientRecMsgClass1=newClientRecMsgClass();privatestringhostn......
  • 快手:数据库升级实践,实现PB级数据的高效管理|OceanBase案例
    本文作者:胡玉龙,快手技术专家快手在较初期采用了OceanBase 3.1版本成功替换了多个核心业务、数百套的MySQL集群。至2023年,快手的数据量已突破800TB大关,其中最大集群的数据量更是达到了数百TB级别。为此,快手将数据库系统升级至OceanBase4.x版本,从而显著提升了业务的稳定性和......
  • java实现导出excel添加水印或excel转pdf并添加水印
    1.通过Map对象存入excel模板中获得excel表,并添加水印importorg.apache.poi.xssf.usermodel.XSSFWorkbook;publicstaticvoidexportExcelWatermark(TemplateExportParamstemplatePath,Map<String,Object>map,StringfileName,StringmarkText,HttpServletResponseres......
  • O365和Keycloak结合SSO实现
    背景内部用keycloak实现SSO,近期引入了Office365,需要接入keycloak(saml协议),实现SSO。遇到的问题Office365按照官方文档配置后,负责keycloak的同学帮着调试好后,sso总是提示失败。总是提示找不到用户。按照官方文档https://learn.microsoft.com/en-us/entra/identity/hybrid/con......
  • 怎样改变自己的ip地址?8种方法轻松实现
    在当今数字化时代,了解怎样改变自己的IP地址已成为一项重要技能。无论是出于保护个人隐私,还是突破网络限制等需求,掌握改变IP地址的方法都显得尤为重要。本文将深入探讨改变IP地址的几种方法,让你轻松应对不同场景下的网络需求。要改变自己的IP地址,有几种常见的方法可以实现:‌1......
  • C#实现多线程的几种方式
    前言多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率。多线程常用场景CPU密集型任务.I/O密集型任务.并发请求处理.大数......
  • 使用异或操作实现字符串加密与解密
    异或加密是一种简单而有效的加密技术,它的特点是同一密钥可用于加密和解密,以下是一个例子:usingSystem;usingSystem.Text;publicstaticclassEncryption{///<summary>///bytes数据通过encryptCode进行异或(加密|解密)///将传入的bytes作为返回值,不再额外分......
  • 淘宝千牛客服机器人实现全自动收发消息
    引言随着电商行业的快速发展,淘宝、天猫等电商平台成为了许多商家的主要销售渠道。为了提高操作效率和降低人工错误率,许多商家开始使用自动化工具来管理和操作他们的电商店铺。千牛自动化就是其中一种常见的自动化工具,它可以帮助商家自动化执行一些常见的操作,如商品管理、订单管理......
  • 基于Java的校园外卖系统设计与实现源码+两万字论文+答辩PPT+开题报告
    又快到了准备毕业设计的时候了,相信大部分宝子们还没有头绪吧。没有关系的,看完本文相信会让你受益匪浅。 一、项目介绍 本系统是面向所有人的外卖点餐系统。系统内的角色分为管理员和前台用户。管理员有权登录管理端进行如员工信息管理、分类、菜品与套餐管理、查看订单详......