【Spring Security】 快速入门

文章目录

  • 一、 身份认证Demo
    • 1、创建工程
    • 2、代码编写
      • 2.1、Controller
      • 2.2、Html
      • 2.3、application.properties配置
    • 3、启动项目并访问
  • 二、Spring Security 默认做了什么
  • 二、底层原理
    • 1.概述
    • 2.Filters
      • DelegatingFilterProxy
      • FilterChainProxy
      • SecurityFilterChain
      • Security Filters
  • 三、程序的启动和运行
    • DefaultSecurityFilterChain
    • SecurityProperties
  • 总结


一、 身份认证Demo

1、创建工程

下载完成后,使用idea打开即可。
创建工程

2、代码编写

2.1、Controller

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

<!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伪代码

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {//延迟获取注册为Spring Bean的Filter,				Filter delegate = getFilterBean(someBeanName);//将工作委托给Spring Beandelegate.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

初始化用户名密码

spring.security.user.name=admin
spring.security.user.password=123

总结

  1. DelegatingFilterProxy作为过滤器的代理,帮助我们调用spring容器中所有注册的过滤器
  2. FilterChainProxy帮助我们管理多个不同的过滤器链(SecurityFilterChain)。
  3. SecurityFilterChain帮助我们处理复杂的业务逻辑,通过匹配不同的url,由不同的过滤器链的组合来接收,从而由不同的过滤器来完成相应的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/575900.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【群智能算法改进】一种改进的同核分子优化算法 IHMO算法【Matlab代码#71】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始HMO算法2. 改进HMO算法2.1 改进的距离减小因子2.2 黄金正弦策略扰动 3. 部分代码展示4. 仿真结果展示5. 资源获取说明 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始HMO算法 同核分子优化算法&#x…

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率&#xff08; A c c u r a c y Accuracy Accuracy&#xff09; 二分类查准率 P r e c i s i o n Precision Precision&#xff0c;查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…

语音模块摄像头模块阿里云结合,实现垃圾的智能识别

语音模块&摄像头模块&阿里云结合 文章目录 语音模块&摄像头模块&阿里云结合1、实现的功能2、配置2.1 软件环境2.2 硬件配置 3、程序介绍3.1 程序概况3.2 语言模块SDK配置介绍3.3 程序文件3.3.1 开启摄像头的程序3.3.2 云端识别函数( Py > C ) & 串口程序…

力扣面试150 二叉搜索树的最小绝对差 中序遍历

Problem: 530. 二叉搜索树的最小绝对差 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 录哥题解 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code // 递归 class Solution {int ans Integer.MAX_VALUE;TreeNode pre;//一开…

【1】网络协议基础概念

【1】网络协议基础知识 1、互联网2、为什么要学习网络协议3、学习中需要搭建的环境4、客户端-服务器5、Java 的跨平台原理6、C/C的跨平台原理7、一个简单的SpringBoot项目(1) pom.xml(2) application.yml(3) NetworkStudyApp.java(4) SwaggerConfig.java(5) HelloWorldControll…

ssm 房屋销售管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 房屋销售管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

Redis中的LRU算法分析

LRU算法 概述 Redis作为缓存使用时&#xff0c;一些场景下要考虑内容的空间消耗问题。Redis会删除过期键以释放空间&#xff0c;过期键的删除策略 有两种: 1.惰性删除:每次从键空间中获取键时&#xff0c;都检查取得的键是否过期&#xff0c;如果过期的话&#xff0c;就删除…

【C语言】内存函数(memcpy)的使用和模拟实现

目录 一、memcpy定义1.memcpy在**cplusplus**中的定义2.memcpy**复制内存块**3.参数a.目的地b.源c.数字 4.函数返回值5.函数头文件 二、memcpy的使用使用memcpy()函数完成拷贝整型数组数据 三、memcpy的模拟实现思路代码 一、memcpy定义 1.memcpy在cplusplus中的定义 链接: l…

MySQL的主从复制与读写分离

在实际的生产环境中&#xff0c;对数据库的读和写都在同一个数据库服务器中&#xff0c;是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此&#xff0c;通过主从复制的方式来同步数据&#xff0c;再通过读写分离来提升数据…

分享react+three.js展示温湿度采集终端

前言 气象站将采集到的相关气象数据通过GPRS/3G/4G无线网络发送到气象站监测中心&#xff0c;摆脱了地理空间的限制。 前端&#xff1a;气象站主机将采集好的气象数据存储到本地&#xff0c;通过RS485等线路与GPRS/3G/4G无线设备相连。 通信&#xff1a;GPRS/3G/4G无线设备通…

Android room 在dao中不能使用挂起suspend 否则会报错

错误&#xff1a; Type of the parameter must be a class annotated with Entity or a collection/array of it. kotlin.coroutines.Continuation<? super kotlin.Unit> $completion); 首先大家检查一下几个点 一、kotlin-kapt 二、 是否引入了 room-ktx 我是2024年…

java电话号码的字母组合(力扣Leetcode17)

电话号码的字母组合 力扣原题链接 问题描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 示例 1&#xff1a;…