【Spring Security】 快速入门

文章目录


一、 身份认证Demo

1、创建工程

下载完成后,使用idea打开即可。

2、代码编写

2.1、Controller

java 复制代码
package com.security.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {

    @GetMapping("/")
    public String index(){
        return "index";
    }
}

2.2、Html

html 复制代码
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org" lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello Security</title>
</head>
<body>
    <h1>Hello Security</h1>
    <a th:href="@{/logout}">Log Out</a>
</body>
</html>

2.3、application.properties配置

复制代码
spring.application.name=security-demo
server.servlet.context-path=/demo
spring.security.user.name=admin
spring.security.user.password=123

3、启动项目并访问

二、Spring Security 默认做了什么

  • 保护应用程序URL,要求对应用程序的任何交互进行身份验证。
  • 程序启动时生成一个默认用户"user"。
  • 生成一个默认的随机密码,并将此密码记录在控制台上。
  • 生成默认的登录表单和注销页面。
  • 提供基于表单的登录和注销流程。
  • 对于Web请求,重定向到登录页面;
  • 对于服务请求,返回401未经授权。
  • 处理跨站请求伪造(CSRF)攻击。
  • 处理会话劫持攻击。
  • 写入Strict-Transport-Security以确保HTTPS。
  • 写入X-Content-Type-Options以处理嗅探攻击。
  • 写入Cache Control头来保护经过身份验证的资源。
  • 写入X-Frame-Options以处理点击劫持攻击。

二、底层原理

1.概述

Spring Security 之所以默认帮助我们做了那么多事情,它的底层原理是传统的Servlet过滤器。

2.Filters

DelegatingFilterProxy

Servlet 容器允许Filter使用自己的标准注册实例,但它不知道Spring定义的Bean。而DelegatingFilterProxy可以获取注册为Spring Bean的Filter。DelegatingFilterProxy通过标准 Servlet 容器机制进行注册,但将所有工作委托给实现Filter.
DelegatingFilterProxy伪代码

java 复制代码
public void doFilter(ServletRequest request, 
					ServletResponse response, FilterChain chain) {
	//延迟获取注册为Spring Bean的Filter,				
	Filter delegate = getFilterBean(someBeanName);
	//将工作委托给Spring Bean
	delegate.doFilter(request, response);
}

FilterChainProxy

Spring Security 的 Servlet 支持包含在FilterChainProxy。FilterChainProxy是 Spring Security 提供的特殊功能Filter,允许Filter通过委托给SecurityFilterChain许多实例。

由于FilterChainProxy是一个 Bean,因此它通常包装在DelegatingFilterProxy中。

SecurityFilterChain

FilterChainProxy使用SecurityFilterChain来确定应该为当前请求调用哪个Spring -SecurityFilter实例。

SecurityFilterChain中的安全过滤器通常是bean,但它们是在FilterChainProxy而不是DelegatingFilterProxy中注册的。FilterChainProxy为直接注册Servlet容器或DelegatingFilterProxy提供了许多优点。

首先,它为Spring Security的所有Servlet支持提供了一个起点。因此,如果您试图对Spring Security的Servlet支持进行故障排除,那么在FilterChainProxy中添加一个调试点是一个很好的开始。

其次,由于FilterChainProxy是Spring Security使用的核心,它可以执行非可选的任务。例如,它清除SecurityContext以避免内存泄漏。

它还应用Spring Security的HttpFirewall来保护应用程序免受某些类型的攻击。

此外,它在确定何时调用SecurityFilterChain方面提供了更大的灵活性。

在Servlet容器中,仅根据URL调用Filter实例。然而,FilterChainProxy可以通过使用RequestMatcher接口,基于HttpServletRequest中的任何内容来确定调用。

在Multiple SecurityFilterChain图中,FilterChainProxy决定应该使用哪个SecurityFilterChain。

只调用第一个匹配的SecurityFilterChain。

如果请求/api/messages/的URL,它首先匹配/api/**的SecurityFilterChaing模式,因此只有SecurityFilterChaing被调用,即使它也匹配

如果请求/messages/的URL,它与/api/**的SecurityFilterChain模式不匹配,因此FilterChainProxy继续尝试每个SecurityFilterChain。

假设没有其他SecurityFilterChain实例匹配,则调用SecurityFilterChain。

注意,SecurityFilterChaing只配置了三个安全过滤器实例。

然而,SecurityFilterChain配置了四个安全过滤器实例。

需要注意的是,每个SecurityFilterChain都可以是唯一的,并且可以单独配置。

事实上,如果应用程序希望Spring security忽略某些请求,SecurityFilterChain可能没有安全过滤器实例。

Security Filters

使用SecurityFilterChain api将安全过滤器插入到FilterChainProxy中。

这些过滤器可用于许多不同的目的,如身份验证、授权、漏洞利用保护等。

过滤器按照特定的顺序执行,以确保在正确的时间调用它们,例如,应该在执行授权的过滤器之前调用执行身份验证的过滤器。

通常不需要知道Spring Security过滤器的顺序。然而,有时知道顺序是有益的,如果你想知道它们,你可以检查FilterOrderRegistration代码。

三、程序的启动和运行

DefaultSecurityFilterChain

SecurityFilterChain接口的实现,加载了默认的16个Filter。

SecurityProperties

初始化用户名密码

propertity 复制代码
spring.security.user.name=admin
spring.security.user.password=123

总结

  1. DelegatingFilterProxy作为过滤器的代理,帮助我们调用spring容器中所有注册的过滤器
  2. FilterChainProxy帮助我们管理多个不同的过滤器链(SecurityFilterChain)。
  3. SecurityFilterChain帮助我们处理复杂的业务逻辑,通过匹配不同的url,由不同的过滤器链的组合来接收,从而由不同的过滤器来完成相应的功能。
相关推荐
huangdong_5 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
記億揺晃着的那天5 小时前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
JAVA面经实录9175 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
JAVA面经实录9176 小时前
操作系统面试题
java·服务器·数据库·计算机网络·面试
一杯奶茶¥7 小时前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码7 小时前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|7 小时前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy7 小时前
java知识五(继承)
java·开发语言
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
DIY源码阁7 小时前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse