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日

相关文章

  • Java8中Stream的详细使用方法大全

    Java8中Stream的详细使用方法大全 本文将详细介绍Java8中Stream的使用方法,包括Stream的定义、Stream常用操作、中间操作和终止操作等。 一、Stream的定义 Stream是Java 8中的新特性,它是对数据集合进行流式操作的API。使用Stream可以让我们更方便地对集合进行操作,提高代码的可读性和代码的简洁性。 二、Strea…

    Java 2023年5月26日
    00
  • 详解Nginx搭建图片服务器过程

    详解Nginx搭建图片服务器过程 Nginx是一款高性能的web服务器,通过配置可以使其支持静态资源的访问。在本篇攻略中,我们将详细讲解如何使用Nginx搭建一个图片服务器,方便用户上传和访问图片资源。 安装与配置Nginx 步骤1:安装Nginx 使用以下命令在Ubuntu中安装Nginx: sudo apt-get update sudo apt-get…

    Java 2023年5月19日
    00
  • vue.js数据响应式原理解析

    Vue.js数据响应式原理解析 Vue.js是一个极易上手,功能强大的Javascript框架,它的核心就是数据响应式系统。在Vue.js中,我们可以轻松的绑定数据和视图,而这一切都得益于Vue.js的数据响应式系统。在本篇文章中,我们将深入剖析Vue.js数据响应式原理。 数据响应式系统란? Vue.js的数据响应式系统简单来说,就是一种将ViewMode…

    Java 2023年5月23日
    00
  • 用JSP创建可重用的图形背景

    下面我会详细讲解如何用JSP创建可重用的图形背景。 1. 确定背景图形 首先,我们需要确定要使用的背景图形。可以在互联网上下载一些免费的背景图像,或者自己设计制作。确保图像大致符合网站设计风格,比如配色、大小等。 2. 创建JSP页面 接下来,我们需要创建一个JSP页面来展示背景图形。可以把背景图形作为JSP页面的背景图片,在页面的CSS中设置背景图像,并将…

    Java 2023年6月15日
    00
  • SpringBoot关于自定义注解实现接口幂等性方式

    对于SpringBoot自定义注解实现接口幂等性,一般可以通过以下几个步骤来完成: 1. 创建幂等性注解 幂等性注解一般包含以下内容: 注解名称:一般用 @Idempotent 表示。 作用范围:一般有方法级别和参数级别两种。 验证方式:一般有请求参数和请求头两种。 具体实现示例: @Target({ElementType.METHOD, ElementTy…

    Java 2023年5月20日
    00
  • gateway、webflux、reactor-netty请求日志输出方式

    为了让大家更好地了解 “gateway、webflux、reactor-netty请求日志输出方式”,我将分别讲解这三个主题,并提供相应的示例代码,在此之前,请确保已经安装好了Java环境,并了解基本的Spring Boot框架。 Gateway请求日志输出方式 Gateway是Spring Cloud的组件之一,可以将多个微服务组合起来作为一个整体对外提供…

    Java 2023年5月20日
    00
  • java 逐行读取txt文本如何解决中文乱码

    要想解决中文乱码问题,需要了解Java中文编码方式的特点。Java会默认使用UTF-8编码格式,而读取txt文本时可能会面对其他编码格式,因此需要进行适当的转码操作。 以下是逐行读取txt文本并解决中文乱码问题的步骤: 创建一个FileReader对象,用于读取txt文件,并指定编码格式为GBK。 FileReader fr = new FileReader…

    Java 2023年5月20日
    00
  • 教你用JDK编译Java文件的方法

    下面是详细讲解“教你用JDK编译Java文件的方法”的完整攻略。 什么是JDK? 首先,我们需要知道什么是JDK。JDK即Java Development Kit(Java开发工具包),它是用于开发Java应用程序、Java Applet以及Java Servlet等程序的软件开发工具包。JDK包括了Java编译器、Java虚拟机(JVM)、Java类库等。…

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