Spring Security 核心过滤器链讲解

对于Spring Security,核心过滤器链可以说是它的核心之一。本文将从什么是核心过滤器链、以及它包含哪些过滤器等方面进行详细讲解。

1. 什么是核心过滤器链?

核心过滤器链是Spring Security运作的基础。当一个请求进来时,它将会被一系列的过滤器处理,处理完成后才会交给真正的应用程序处理。核心过滤器链由一系列的过滤器组成,每个过滤器都有自己的功能和责任。

2. 核心过滤器链包含哪些过滤器?

Spring Security的核心过滤器链由以下过滤器组成:

  1. ChannelProcessingFilter - 它主要负责检查请求是否是从安全渠道(HTTPS)发送来的。如果不是,则拒绝该请求或者将其重定向到HTTPS。

  2. SecurityContextPersistenceFilter - 它的主要作用是在HttpServletRequest中存储Spring Security的SecurityContext。SecurityContext存储了对当前用户的验证信息和授权信息。

  3. ConcurrentSessionFilter - 它负责并发会话控制。如果用户的会话已经被其他人占用,则它将防止用户使用该会话。当然,这个功能是可配置的。

  4. LogoutFilter - 它主要负责用户退出登录时的处理工作,比如清空session、删除cookie等。

  5. UsernamePasswordAuthenticationFilter - 它是用户认证的核心。它接收以POST方式提交的“username”和“password”,并将它们封装成一个UsernamePasswordAuthenticationToken传递给AuthenticationManager进行认证。

  6. DefaultLoginPageGeneratingFilter - 它负责生成默认的登录页面。该过滤器会从当前应用程序的登录页面生成表单,并将它们提供给用户进行登录。

  7. BasicAuthenticationFilter - 它可能是最简单的过滤器之一。它负责基本身份验证。它从HTTP头中提取用户名和密码,并将它们传递给AuthenticationManager进行认证。

  8. RequestCacheAwareFilter - 它负责将请求缓存起来,以便在用户重定向到登录页面后,将请求的原始URL存储在HttpSession中。

  9. SecurityContextHolderAwareRequestFilter - 它负责检查当前请求是否是SECURITY_CONTEXT_ATTRIBUTE设置为NONE的请求。如果是,它将使用SecurityContextHolder来清除安全上下文对象。

  10. AnonymousAuthenticationFilter - 它负责生成匿名Authentication对象,并将其传递给SecurityContextHolder。这个过滤器通常在用户未认证时使用。

  11. SessionManagementFilter - 它负责会话管理,比如会话超时的处理等。

  12. ExceptionTranslationFilter - 它负责在发生认证异常或授权异常时的处理工作。

  13. FilterSecurityInterceptor - 它负责处理URL级别的安全性。它从配置中检索所需的访问级别,并检查当前用户是否具有该访问级别。

3. 核心过滤器链示例

下面是两个基于Spring Security的简单web应用程序的例子:

示例1

  1. 实现类org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer

```java
package com.example.config;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}
```

  1. 配置类com.example.config.WebSecurityConfig

```java
package com.example.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;

configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

   @Autowired
   private UserDetailsService userDetailsService;

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
   }

   @Autowired
   public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
       PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
       auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
   }

}
```

  1. 实现类com.example.config.MyUserDetailsService

```java
package com.example.config;

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.Collections;

@Component
public class MyUserDetailsService implements UserDetailsService {

   private final PasswordEncoder encoder;

   public MyUserDetailsService() {
       this.encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
   }

   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
       if (username.equals("admin")) {
           return User.withUsername("admin").password(encoder.encode("123456")).roles(Collections.singletonList("USER")).build();
       }
       throw new UsernameNotFoundException("User '" + username + "' not found");
   }

}
```

示例2

  1. 实现类org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer

```java
package com.example.config;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}
```

  1. 配置类com.example.config.WebSecurityConfig

```java
package com.example.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

   @Autowired
   private UserDetailsService userDetailsService;

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().and().httpBasic();
   }

   @Autowired
   public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
       PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
       auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
   }

}
```

  1. 控制器类com.example.controller.PublicController

```java
package com.example.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PublicController {

   @GetMapping("/public")
   public String publicEndpoint() {
       return "Hello Public!";
   }

}
```

  1. 控制器类com.example.controller.SecureController

```java
package com.example.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SecureController {

   @GetMapping("/secure")
   public String secureEndpoint() {
       return "Hello Secure!";
   }

}
```

通过对两个示例的了解,我们可以初步认识Spring Security核心过滤器链的作用和用法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security 核心过滤器链讲解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Sprint Boot @Resource使用方法详解

    在Spring Boot中,@Resource注解用于指定依赖注入的具体实现类。本文将详细介绍@Resource注解的作用和使用方法,并提供两个示例。 @Resource注解的作用 在Spring Boot中,@Resource注解用于指定依赖注入的具体实现类。使用@Resource注解,可以避免依赖注入时出现歧义,确保注入的是正确的实现类。 @Resour…

    Java 2023年5月5日
    00
  • Java压缩文件工具类ZipUtil使用方法代码示例

    下面我来详细介绍一下“Java压缩文件工具类ZipUtil使用方法代码示例”的完整攻略。 一、ZipUtil工具类介绍 ZipUtil是一个Java压缩文件工具类,它可以将文件或文件夹压缩为zip格式的压缩包,并可以对压缩包进行解压操作。ZipUtil支持中文文件名,可以压缩包含中文文件名的文件或文件夹。 使用ZipUtil前需要导入依赖: <depe…

    Java 2023年5月20日
    00
  • Spring boot整合security详解

    Spring Boot整合Security详解 Spring Security是一个功能强大的安全框架,可以帮助我们保护Web应用程序。Spring Boot提供了与Spring Security的无缝集成,本文将详细介绍如何使用Spring Boot整合Security,并提供两个示例。 添加依赖 首先,我们需要在pom.xml文件中添加Spring Se…

    Java 2023年5月15日
    00
  • java JSON解析库Alibaba Fastjson用法详解

    Java JSON解析库Alibaba Fastjson用法详解 JSON作为一种轻量级的数据交换格式,被广泛应用于各种应用中。而Alibaba Fastjson作为一个性能优越、使用简单的JSON解析库,受到了开发者的喜爱。本文将详细讲解Fastjson的使用方法。 前置知识 在使用Fastjson之前,需要了解一些相关的知识: JSON格式(了解其基本结…

    Java 2023年5月26日
    00
  • java编程之递归算法总结

    Java编程之递归算法总结 什么是递归算法 递归算法是指一个函数在运行过程中调用它自己的情况。递归函数通常包含一个终止条件,当达到这个条件时,函数将不再调用自身,防止形成无限循环。递归算法在计算机科学中有着广泛的应用,例如树形数据结构的遍历、排序、查找等。 递归算法的基本原则 递归算法的基本原则是分为两个部分: 基本情况(Base Case):表示递归终止的…

    Java 2023年5月19日
    00
  • java获取当前时间的四种方法代码实例

    下面是完整的攻略。 介绍 在Java中,我们常常需要获取当前的时间,用于记录日志、统计应用程序的运行时长等等。本文将介绍四种获取当前时间的方法,并提供相应的代码实例。 方法一:使用System类的currentTimeMillis()方法获取当前时间 System类提供了一个静态的currentTimeMillis()方法,可以获取当前的毫秒数,从而计算出当…

    Java 2023年5月20日
    00
  • JSP防止网页刷新重复提交数据的几种方法

    当使用JSP开发Web应用程序时,我们经常需要防止用户在刷新网页时重复提交表单,以免造成数据异常和重复提交的问题。以下是几种防止网页刷新重复提交数据的方法: 1. 后端验证防止重复提交 在用户提交表单后,在后端需要进行以下验证: 生成并存储一个唯一的 token,当用户提交表单时,将 token 设置为 session 或者隐藏字段; 再次提交时,验证表单提…

    Java 2023年6月15日
    00
  • Java毕业设计实战之财务预算管理系统的实现

    Java毕业设计实战之财务预算管理系统的实现 1. 确定项目需求 在设计财务预算管理系统之前,我们需要先明确项目需求,对整个系统的功能、架构、流程等方面有一个清晰的认识。一般而言,一个财务预算管理系统应该包括以下几个方面的功能: 用户登录和权限管理 预算制定和管理功能 预算执行和监控功能 预算分析和报告功能 针对以上需求,我们可以进行一个详细的需求分析,并制…

    Java 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部