Hello SpringSecurity

 👩‍💻博客主页:大家好我是poizxc2014的博客主页
✨欢迎关注🖱点赞🎀收藏⭐留言✒
📖个人主页:poizxc2014的博客_CSDN博客-数据库,mysql,java领域博主
💻首发时间:🎞2022年08月07日🎠
🔥💖🔮😘🔏🀄🎧如果觉得博主的文章还不错的话,👍请三连支持一下博主哦🤞
最后的话,在很多方面还做的不好的地方,欢迎大佬指正,一起学习哦,冲冲冲

目录

一、hello-security

第 1 步:引入依赖

 第 2 步:创建启动类

第 3 步:创建请求处理资源类

第 4 步:启动,浏览器访问 http://localhost:8080/hello 验证


Spring Security 官网文档:https://docs.spring.io/spring-security/reference/index.html

Spring Security 是一个安全框架,提供了身份验证、授权和对常见攻击的保护。对命令式和响应式应用程序的安全提供了一流的支持,它实际上是保护基于 spring 的应用程序的标准。

一、hello-security

第 1 步:引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.6.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>example</groupId>
	<artifactId>hello-security</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>hello-security</name>
	<description>Hello Security</description>
	<properties>
		<java.version>8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 第 2 步:创建启动类

package example.hellosecurity;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration;

/**
 * Spring Security Servlet Application.
 *
 * @author poizxc2014
 * @date 2022/8/7
 */
@SpringBootApplication
public class HelloSecurityApplication {
    /**
     * Spring Boot 自动:     
     *     启用 Spring Security 的默认配置,它将创建一个 servlet Filter 作为一个名为 springSecurityFilterChain 的 bean
     *     此 bean 负责应用程序内的所有安全性(保护应用程序url、验证提交的用户名和密码、重定向到登录表单,等等)。    
     *     创建一个 UserDetailsService bean,该 bean 的用户名为 user,并随机生成一个登录到控制台的密码。    
     *     为每个请求,向 Servlet 容器注册一个名为 springSecurityFilterChain 的 bean 的 Filter。  
     *
     * @param args
     * @see WebSecurityConfiguration#springSecurityFilterChain()
     * @see UserDetailsServiceAutoConfiguration#inMemoryUserDetailsManager
     */
    public static void main(String[] args) {
        SpringApplication.run(HelloSecurityApplication.class, args);
    }
}

第 3 步:创建请求处理资源类

package example.hellosecurity.rest;

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

@RestController
public class UserResource {

    @GetMapping("/hello")
    public String hello() {
        return "hello spring security";
    }
}

第 4 步:启动,浏览器访问 http://localhost:8080/hello 验证

  • user: user

  • password: 控制台中查找

Using generated security password: 164cd0e7-d246-405b-bf06-7330ffdf9efe

二、整体架构

基于 Servlet Filter

Spring 提供了一个名为 DelegatingFilterProxy 的过滤器实现,它允许在 Servlet 容器的生命周期和 Spring 的 ApplicationContext 之间进行桥接。

Servlet 容器允许使用它自己的标准注册 Filters,但它不知道 Spring 定义的 bean。

DelegatingFilterProxy 可以通过标准的 Servlet 容器机制进行注册,但将所有工作委托给实现 Filter 的 Spring Bean。

DelegatingFilterProxy 从 ApplicationContext 中查找 Filter0 并调用,下面是伪代码:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
	Filter delegate = getFilterBean(someBeanName);
	delegate.doFilter(request, response);
}

FilterChainProxy

Spring Security 的 Servlet 支持包含在 FilterChainProxy 中。

FilterChainProxy 是 Spring Security 提供的一个特殊的过滤器,它允许通过 SecurityFilterChain 委托给许多过滤器实例。

因为 FilterChainProxy 是一个 Bean,所以它通常被封装在 DelegatingFilterProxy 中。

SecurityFilterChain

SecurityFilterChain 被 FilterChainProxy 用来决定哪个 Spring Security Filters 应该被这个请求调用。

在多个 SecurityFilterChain 中,FilterChainProxy 如何决定使用哪个SecurityFilterChain。

  • 只有第一个匹配的 SecurityFilterChain 将被调用。
  • 如果一个URL /api/messages/ 被请求,它将首先匹配 SecurityFilterChain0 的 /api/** 模式,所以只有 SecurityFilterChain0 将被调用,即使它也匹配SecurityFilterChainN。
  • 如果一个URL /messages/ 被请求,它将不匹配 SecurityFilterChain0 的模式 /api/**,所以 FilterChainProxy 将继续尝试每个 SecurityFilterChain

 过滤器的顺序

​​​​​​ChannelProcessingFilter
WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
CorsFilter
CsrfFilter
LogoutFilter
OAuth2AuthorizationRequestRedirectFilter
Saml2WebSsoAuthenticationRequestFilter
X509AuthenticationFilter
AbstractPreAuthenticatedProcessingFilter
CasAuthenticationFilter
OAuth2LoginAuthenticationFilter
Saml2WebSsoAuthenticationFilter
UsernamePasswordAuthenticationFilter
OpenIDAuthenticationFilter
DefaultLoginPageGeneratingFilter
DefaultLogoutPageGeneratingFilter
ConcurrentSessionFilter
DigestAuthenticationFilter
BearerTokenAuthenticationFilter
BasicAuthenticationFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
JaasApiIntegrationFilter
RememberMeAuthenticationFilter
AnonymousAuthenticationFilter
OAuth2AuthorizationCodeGrantFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
SwitchUserFilte 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值