- 浏览: 193795 次
- 性别:
- 来自: 南京
文章分类
最新评论
一、SecurityContextPersistenceFilter功能和属性
1.在前面介绍spring filter顺序时,我们简单介绍过SecurityContextPersistenceFilter,他主要有两个作用。
其中在请求结束后清除SecurityContextHolder中的SecurityContext的操作是必须的,因为默认情况下SecurityContextHolder会把SecurityContext存储到ThreadLocal中,而这个thread刚好是存在于servlet容器的线程池中的,如果不清除,当后续请求又从线程池中分到这个线程时,程序就会拿到错误的认证信息。
2.SecurityContext存储类SecurityContextRepository
从Spring Security 3.0开始,存储和加载securityContext都是通过SecurityContextRepository来完成的
其中参数HttpRequestResponseHolder仅仅是一个request和response的封装类,从而允许这个接口的具体实现类对request和response进行包装,返回的对象会传入到后续的filter中。
默认情况下,spring boot用的具体实现类是HttpSessionSecurityContextRepository,把SecurityContext存入到HttpSession的属性中,这个类最主要的配置属性是allowSessionCreation默认是true,这样当需要为认证用户存储security context而对应的session还不存在时,这个类就会为当前用户创建session对象。
在spring security中这个接口还有另一个实现-NullSecurityContextRepository,这个类不会存储当前的SecurityContext,即便用户已经认证成功。
二、在spring boot环境下,采用Java config机制这个filter是如何追加到servlet中对我们的请求进行拦截的呢。
在前面的章节(spring-security(十六)Filter配置原理)中,我们知道spring 安全相关的Filter是在WebSecurity的build方法中调用HttpSecurity的build来将追加到HttpSecurity中filter列表排好序后构建成SecurityFilterChain,再把所有的SecurityFilterChain追加到FilterChainProxy中,最后通过DelegatingFilterProxy注册到ServletContext中的,下面我们主要来看下这个类是如何追加到HttpSecuriy的filter列表中的。
1. 从我们的配置入口WebSecurityConfigurerAdapter类开始,在这个类的getHttp()方法中,采用默认配置时会调用http.securityContext()方法
在这个方法中创建了一个实现了SecurityConfigurer接口的配置类SecurityContextConfigurer,通过调用getOrApply方法最终追加到HttpSecurity的configurers属性中,通过这个配置类我们也可以设置SecurityContextPersistenceFilter中的SecurityContextRepository属性。
2. WebSecurity在构建HttpSecurity时,会调用HttpSecurity的build方法,这个方法会先执行HttpSecurity的configure()方法,就是依次调用configurers属性中各个SecurityConfigurer的configure方法
下面来看下SecurityContextConfigurer的configure方法
很明显,在这个方法里面会创建一个SecurityContextPersistenceFilter,设置对应的SecurityContextRepository属性,并追加到了HttpSecurity的filter列表中,这样就可以和其他的过滤器一样对我们的请求进行过滤了。
可以看到这个过滤器功能并不复杂,实际上spring security通过大量的过滤器将功能进行明确的拆分,即方便了扩展,也大大提升了代码的可读性。
1.在前面介绍spring filter顺序时,我们简单介绍过SecurityContextPersistenceFilter,他主要有两个作用。
- 请求开始时从对应的SecurityContextRepository获取securityContext存入SecurityContextHolder中
- 请求结束时清除SecurityContextHolder中的securityContext,将本次请求执行后新的SecurityContext存入到对应的SecurityContextRepository中
其中在请求结束后清除SecurityContextHolder中的SecurityContext的操作是必须的,因为默认情况下SecurityContextHolder会把SecurityContext存储到ThreadLocal中,而这个thread刚好是存在于servlet容器的线程池中的,如果不清除,当后续请求又从线程池中分到这个线程时,程序就会拿到错误的认证信息。
2.SecurityContext存储类SecurityContextRepository
从Spring Security 3.0开始,存储和加载securityContext都是通过SecurityContextRepository来完成的
public interface SecurityContextRepository { SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder); void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response); boolean containsContext(HttpServletRequest request); }
其中参数HttpRequestResponseHolder仅仅是一个request和response的封装类,从而允许这个接口的具体实现类对request和response进行包装,返回的对象会传入到后续的filter中。
默认情况下,spring boot用的具体实现类是HttpSessionSecurityContextRepository,把SecurityContext存入到HttpSession的属性中,这个类最主要的配置属性是allowSessionCreation默认是true,这样当需要为认证用户存储security context而对应的session还不存在时,这个类就会为当前用户创建session对象。
在spring security中这个接口还有另一个实现-NullSecurityContextRepository,这个类不会存储当前的SecurityContext,即便用户已经认证成功。
二、在spring boot环境下,采用Java config机制这个filter是如何追加到servlet中对我们的请求进行拦截的呢。
在前面的章节(spring-security(十六)Filter配置原理)中,我们知道spring 安全相关的Filter是在WebSecurity的build方法中调用HttpSecurity的build来将追加到HttpSecurity中filter列表排好序后构建成SecurityFilterChain,再把所有的SecurityFilterChain追加到FilterChainProxy中,最后通过DelegatingFilterProxy注册到ServletContext中的,下面我们主要来看下这个类是如何追加到HttpSecuriy的filter列表中的。
1. 从我们的配置入口WebSecurityConfigurerAdapter类开始,在这个类的getHttp()方法中,采用默认配置时会调用http.securityContext()方法
public SecurityContextConfigurer<HttpSecurity> securityContext() throws Exception { return getOrApply(new SecurityContextConfigurer<HttpSecurity>()); }
在这个方法中创建了一个实现了SecurityConfigurer接口的配置类SecurityContextConfigurer,通过调用getOrApply方法最终追加到HttpSecurity的configurers属性中,通过这个配置类我们也可以设置SecurityContextPersistenceFilter中的SecurityContextRepository属性。
2. WebSecurity在构建HttpSecurity时,会调用HttpSecurity的build方法,这个方法会先执行HttpSecurity的configure()方法,就是依次调用configurers属性中各个SecurityConfigurer的configure方法
private void configure() throws Exception { Collection<SecurityConfigurer<O, B>> configurers = getConfigurers(); for (SecurityConfigurer<O, B> configurer : configurers) { configurer.configure((B) this); } }
下面来看下SecurityContextConfigurer的configure方法
public void configure(H http) throws Exception { SecurityContextRepository securityContextRepository = http .getSharedObject(SecurityContextRepository.class); if(securityContextRepository == null) { securityContextRepository = new HttpSessionSecurityContextRepository(); } SecurityContextPersistenceFilter securityContextFilter = new SecurityContextPersistenceFilter(securityContextRepository); SessionManagementConfigurer<?> sessionManagement = http .getConfigurer(SessionManagementConfigurer.class); SessionCreationPolicy sessionCreationPolicy = sessionManagement == null ? null: sessionManagement.getSessionCreationPolicy(); if (SessionCreationPolicy.ALWAYS == sessionCreationPolicy) { securityContextFilter.setForceEagerSessionCreation(true); } securityContextFilter = postProcess(securityContextFilter); http.addFilter(securityContextFilter); }
很明显,在这个方法里面会创建一个SecurityContextPersistenceFilter,设置对应的SecurityContextRepository属性,并追加到了HttpSecurity的filter列表中,这样就可以和其他的过滤器一样对我们的请求进行过滤了。
可以看到这个过滤器功能并不复杂,实际上spring security通过大量的过滤器将功能进行明确的拆分,即方便了扩展,也大大提升了代码的可读性。
发表评论
-
spring-security(二十五)鉴权
2018-03-27 11:21 1599前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81581.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1340前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1801前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1236一、UsernamePasswordAuthenticatio ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2059前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2343前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12421.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7900前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2385前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1224前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1470前言: 作为spring security的核心类,大多数 ... -
spring-security(十三)核心服务类
2018-02-18 16:46 1411前言: 在之前的篇章中我们已经讲述了spring secu ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2526前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1237前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2106前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 867前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2067前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 670前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
《Spring Security核心库3.1.0.RC1详解》 Spring Security是Java平台上的一款强大且高度可配置的安全框架,用于解决Web应用和企业级应用的安全需求。在本篇文章中,我们将深入探讨Spring Security的核心库——`...
- `thymeleaf-extras-springsecurity4-3.0.0.RELEASE.jar`: 使得Thymeleaf模板引擎能够与Spring Security无缝协作,方便地在页面上展示权限相关的控制。 10. **消息安全** - `spring-security-messaging-4.0.0....
在Spring Security中,所有的安全性操作都是通过Filter Chain来实现的。这些过滤器如`DelegatingFilterProxy`、`SecurityContextPersistenceFilter`、`UsernamePasswordAuthenticationFilter`等,按照配置的顺序...
3. **Filter安全链**:Spring Security 的Web安全功能主要通过一系列过滤器实现,这些过滤器构成了安全链。其中关键的过滤器有`DelegatingFilterProxy`、`ChannelProcessingFilter`、`...
- **请求处理**:当用户尝试访问受保护的资源时,Spring Security 的 Filter Security Interceptor 检测请求并触发认证过程。 - **登录**:用户提交登录信息后,UsernamePasswordAuthenticationFilter 处理这些...
3. **过滤器链(Filter Chain)**:Spring Security的核心是过滤器链,它由多个安全相关的过滤器组成,这些过滤器按照特定顺序执行,处理HTTP请求。主要的过滤器包括`DelegatingFilterProxy`、`...
关键过滤器包括:DelegatingFilterProxy(指向Spring Security Filter Chain的代理)、ChannelProcessingFilter(处理HTTPS请求)、SecurityContextPersistenceFilter(在请求之间保存安全上下文)、LogoutFilter...
核心 - spring-security-core.jar 25 远程处理 - spring-security-remoting.jar 25 Web - spring-security-web.jar 25 配置 - spring-security-config.jar 26 LDAP - spring-security-ldap.jar 26 ACL - spring-...
关键的过滤器包括 `DelegatingFilterProxy`(指向 Spring Security 的 FilterChainProxy)、`SecurityContextPersistenceFilter`(在请求之间保持安全上下文)、`UsernamePasswordAuthenticationFilter`(处理登录...
1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. Config -...
Spring Security 的核心在于过滤器链,其中`DelegatingFilterProxy`扮演关键角色。这个过滤器代理了其他所有过滤器,并必须在`web.xml`中声明,名为`springSecurityFilterChain`。`DelegatingFilterProxy`按照特定...
Spring Security 是一个...4. **过滤器链(Filter Chain)**:Spring Security 的核心过滤器包括 `SecurityContextPersistenceFilter`(维护安全上下文)、`UsernamePasswordAuthenticationFilter`(处理登录请求)、`...
3. **过滤器链(Filter Chain)**:Spring Security 的核心在于其过滤器链,它处理 HTTP 请求并执行认证和授权过程。默认的过滤器包括 SecurityContextPersistenceFilter、UsernamePasswordAuthenticationFilter 等...
在提供的压缩包`springsecurity配置demo`中,你将找到示例代码和详细说明,这将帮助你更好地理解和实践上述概念。通过学习和实践这些示例,你将能够为自己的Spring应用程序构建强大的安全防护。
- **Filter Chain**: Spring Security的核心在于其过滤器链,它处理HTTP请求,执行认证和授权过程。这些过滤器包括`DelegatingFilterProxy`、`ChannelProcessingFilter`、`SecurityContextPersistenceFilter`、`...
这个"SpringSecurity安全框架基础Demo"旨在帮助开发者快速理解和实践Spring Security的核心功能。 **1. 用户认证** 在Spring Security中,用户认证主要由Authentication对象负责。当用户尝试访问受保护的资源时,...
#### 二、Spring Security 4.1 新特性 - **Java 配置提升**: - 支持更简洁的 Java 配置方式,减少 XML 配置的使用。 - 引入了 `@EnableWebSecurity` 和 `SecurityConfigurerAdapter` 等注解简化配置过程。 - **...
3. **过滤器链(Filter Chain)**:Spring Security 使用一系列过滤器处理请求,如 `SecurityContextPersistenceFilter` 保存和恢复安全上下文,`UsernamePasswordAuthenticationFilter` 处理登录请求。理解过滤器链...
3. **过滤器链**:Spring Security的核心是FilterSecurityInterceptor,它是基于Servlet Filter实现的。一系列预定义的过滤器(如SecurityContextPersistenceFilter, UsernamePasswordAuthenticationFilter等)构成...
1. **架构概述**:Spring Security的核心架构由一系列组件构成,如Filter Chain、Authentication Manager、Access Decision Manager等。学习这些组件如何协同工作,可以深入理解Spring Security的整体工作流程。 2....