首页 > 其他分享 >Spring常用过滤器(Filter)-SecurityContextHolderAwareRequestFilter

Spring常用过滤器(Filter)-SecurityContextHolderAwareRequestFilter

时间:2024-11-02 08:48:20浏览次数:6  
标签:HttpServletRequest --- Spring factory Filter 访问 上下文 SecurityContextHolderAwareRe

SecurityContextHolderAwareRequestFilter:使HttpServletRequestWrapper能够感知SecurityContextHolder的过滤器。

1.1 功能概述:
1.1.1 SecurityContextHolderAwareRequestFilter通过Wrapper/Decorator模式对HttpServletRequest进行包装,使其具备访问SecurityContextHolder中安全上下文的能力。这样,接口HttpServletRequest上定义的安全相关方法(如getUserPrincipal)才能访问到相应的安全信息。
1.2 核心功能:
1.2.1 请求包装:
--- SecurityContextHolderAwareRequestFilter使用HttpServlet3RequestFactory(针对Servlet 3.0及以上版本)或相应的工厂类来创建SecurityContextHolderAwareRequestWrapper实例。
--- SecurityContextHolderAwareRequestWrapper扩展了HttpServletRequest,并添加了访问安全上下文的方法。
1.2.2 安全上下文访问:
--- 包装后的请求可以通过getUserPrincipal、getRemoteUser等方法访问安全上下文中的用户信息。
--- 这些方法从SecurityContextHolder中获取当前认证的用户信息。
1.2.3 过滤器链执行:
--- 在doFilter方法中,SecurityContextHolderAwareRequestFilter使用包装后的请求继续过滤器链的执行。
--- 这样可以确保后续的过滤器或控制器能够访问到安全上下文中的用户信息。
1.3 核心代码分析:

public class SecurityContextHolderAwareRequestFilter extends GenericFilterBean {  
    // 角色名称前缀,默认为"ROLE_"  
    private String rolePrefix = "ROLE_";  
    // 用于封装HttpServletRequest的工厂类  
    private HttpServletRequestFactory requestFactory;  
    // 其他安全相关的属性,如authenticationEntryPoint、authenticationManager等  
  
    @Override  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)  
            throws IOException, ServletException {  
        // 使用requestFactory创建包装后的请求,并继续过滤器链的执行  
        chain.doFilter(this.requestFactory.create((HttpServletRequest) req, (HttpServletResponse) res), res);  
    }  
  
    @Override  
    public void afterPropertiesSet() throws ServletException {  
        super.afterPropertiesSet();  
        // 初始化requestFactory  
        updateFactory();  
    }  
  
    private void updateFactory() {  
        // 创建HttpServlet3RequestFactory实例,并设置相关属性  
        this.requestFactory = createServlet3Factory(rolePrefix);  
    }  
  
    private HttpServletRequestFactory createServlet3Factory(String rolePrefix) {  
        HttpServlet3RequestFactory factory = new HttpServlet3RequestFactory(rolePrefix);  
        // 设置信任解析器、认证入口点、认证管理器、注销处理器等  
        factory.setTrustResolver(this.trustResolver);  
        factory.setAuthenticationEntryPoint(this.authenticationEntryPoint);  
        factory.setAuthenticationManager(this.authenticationManager);  
        factory.setLogoutHandlers(this.logoutHandlers);  
        return factory;  
    }  
}

1.4 使用场景:
1.4.1 控制器方法参数解析:当控制器方法的参数类型为Principal时,Spring MVC的ServletRequestMethodArgumentResolver会调用request#getUserPrincipal()来获取用户信息。
1.4.2 Token获取:在OAuth2或JWT等认证机制中,获取token的请求可能需要访问用户信息。SecurityContextHolderAwareRequestFilter可以确保这些请求能够访问到安全上下文中的用户信息。
1.5 总结:
SecurityContextHolderAwareRequestFilter是Spring Security框架中的一个重要组件,它通过包装HttpServletRequest请求,使其能够访问SecurityContextHolder中的安全上下文。这样,后续的过滤器、控制器或其他组件就可以方便地访问用户信息和其他安全相关的数据。

标签:HttpServletRequest,---,Spring,factory,Filter,访问,上下文,SecurityContextHolderAwareRe
From: https://blog.csdn.net/qq_43061724/article/details/143445516

相关文章

  • 如何在Spring Boot应用中配置全局异常处理器?
    在SpringBoot应用中,可以通过以下步骤配置全局异常处理器:一、创建全局异常处理类创建一个类并添加@ControllerAdvice注解,这个注解表示该类是一个全局的控制器增强类,用于处理控制器中抛出的异常。importorg.springframework.http.HttpStatus;importorg.springframew......
  • springboot作业管理系统
      运行环境环境说明:开发语言:java框架:springboot,vueJDK版本:JDK1.8数据库:mysql5.7+(推荐5.7,8.0也可以)数据库工具:Navicat11+开发软件:idea/eclipse(推荐idea)Maven包:Maven3.3.9+系统实现学生管理管理员可以添加,查询,修改,删除学生。下图就是学生管理页面。......
  • springboot在线教育系统
      运行环境环境说明:开发语言:java框架:springboot,vueJDK版本:JDK1.8数据库:mysql5.7+(推荐5.7,8.0也可以)数据库工具:Navicat11+开发软件:idea/eclipse(推荐idea)Maven包:Maven3.3.9+系统详细实现普通管理员管理管理员可以对普通管理员账号信息进行添加修改删除......
  • 毕业设计-springboot二手交易网站
    项目简介校园二手物品交易系统,该系统基于B/S架构模式,使用SSM框架开发,并根据现有的网络二手交易系统设计优化而成。系统主要以Java语言作为开发基础,使用了Jsp+Sping+SpringMVC+Mybatis等技术,采用MyEclipse作为开发工具,以MySql作为数据库工具,使用Tomcat作为Web服务器。本系统......
  • 毕业设计-基于springboot与vue实现的个人财务管理系统
    项目简介基于springboot与vue实现的个人财务管理系统,主要包含前后端项目源码,数据库文件,参考论文。1. 登录管理:首先用户输入正确的用户名、密码及对应的角色,然后登录系统,未注册的新用户可自行注册账号后再登录,如果能输入有误,则系统会提示错误信息而无法正常登录。2. 收支......
  • 基于java中的springboot框架实现旅游管理系统项目演示【内附项目源码+论文说明】
    基于java中的springboot框架实现旅游管理系统项目演示【内附项目源码+LW说明】摘要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在短时......
  • 基于java中的springboot框架实现经方药食两用服务平台项目演示【内附项目源码+论文说
    基于java中的springboot框架实现经方药食两用服务平台项目演示【内附项目源码+LW说明】摘要近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定经方药食两用服务平台......
  • 基于java中的springboot框架实现旅游管理系统项目演示【内附项目源码+论文说明】
    基于java中的springboot框架实现旅游管理系统项目演示【内附项目源码+LW说明】摘要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在短时......
  • Java项目实战II基于Java+Spring Boot+MySQL的工程教育认证的计算机课程管理平台(源码+
    目录一、前言二、技术介绍三、系统实现四、文档参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着工程教育认证的深入发展,对计算机课程......