【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.mzph.cn/news/781096.shtml

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

相关文章

vue3-pinia使用(末尾有彩蛋)

什么是 pinia Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 之前用的是 vuex&#xff0c;后面 vue 官方团队不维护了&#xff0c;推荐使用 pinia 安装 yarn add pinia # 或者使用 npm npm install piniapnpm install piniaStore 是什么&#xf…

实验一 Python集成开发环境的搭建及可视化库的安装

一、安装集成开发环境 下载安装包 官方网址&#xff1a; Free Download | Anaconda 或者镜像网站下载&#xff08;较快&#xff09; https://repo.anaconda.com/archive/ 安装 配置环境变量 验证 输入&#xff1a; conda -V 二、下载pyecharts环境 点击 Anaconda Promp…

spring-boot之shiro安全框架配置使用

shiro架构&#xff08;外部&#xff09; shiro架构(内部) 具体API操作 获取当前的用户对象 Subject currentUser SecurityUtils.getSubject();通过当前用户拿到session Session session currentUser.getSession(); session.setAttribute("someKey", "aValu…

微信公众号运营必备工具合集

微信公众号运营必备工具合集 各位同学&#xff0c;想要成为一名合格的公众号运营&#xff0c;必须要搭建一个属于自己的运营工具库&#xff0c;可以在日常工作中最大限度的提高效率。 91微信编辑器 &#xff1a;http://bj.91join.com/ 壹伴助手&#xff1a;https://yiban.io…

下载及安装PHP,composer,phpstudy,thinkPHP6.0框架

文章目录 前言 thinkPHP是一款开源的PHP框架&#xff0c;它是基于MVC&#xff08;Model-View-Controller&#xff09;设计模式构建的。thinkPHP提供了丰富的功能和组件&#xff0c;使得开发人员可以快速、高效地构建和维护Web应用程序。 以下是thinkPHP框架的一些特点和功能&…

上位机图像处理和嵌入式模块部署(qmacvisual测量标定)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在机器视觉中,测量是很重要的一个环节。如果是简单的定位,可能精度要求并不那么严格。但是如果是对产品进行QA测量,需要精确到0.1mm,甚至是0.05mm这样的精度,那就需要对camera…

蓝队面经(一)

蓝队面经(一) 文章目录 蓝队面经(一)入侵排查思路windows入侵排查思路Linux入侵排查思路 Linux 如何查看登录日志Windows 和 Linux 的日志文件放在哪里&#xff1f;WindowsLinux Linux 常用排查命令有哪些&#xff1f;Linux 的 Selinux 是什么&#xff1f;如何设置 Selinux&…

【Leetcode】2952. 需要添加的硬币的最小数量

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个下标从 0 0 0 开始的整数数组 c o i n s coins coins&#xff0c;表示可用的硬币的面值&#xff0c;以及一个整数 t a r g e t target target 。 如果存在某个 c o i …

剑指Offer题目笔记21(计数排序)

面试题74&#xff1a; 问题&#xff1a; ​ 输入一个区间的集合&#xff0c;将重叠的区间合并。 解决方案&#xff1a; ​ 先将所有区间按照起始位置排序&#xff0c;然后比较相邻两个区间的结束位置就能知道它们是否重叠。如果它们重叠就将它们合并&#xff0c;然后判断合并…

精选2024年最佳项目管理系统!实用推荐与详细评测

随着企业规模的扩大&#xff0c;项目量也会呈几何倍的增长&#xff0c;项目管理系统就成了企业管理必不可少的一部分。2024年优秀的项目管理系统推荐。今年为大家带来Microsoft Project、Zoho Projects、Jira以及Wrike项目管理系统评测。 什么是项目管理系统&#xff1f; 项目…

怎么更新sd-webui AUTOMATIC1111/stable-diffusion-webui ?

整个工程依靠脚本起来的&#xff1a; 可直接到stable-diffusion-webui子目录执行&#xff1a; git pull更新代码完毕后&#xff0c;删除venv的虚拟环境。 然后再次执行webui.sh&#xff0c;这样会自动重新启动stable-diffusion-webui.

springboot心灵治愈交流平台

摘 要 本论文主要论述了如何使用JAVA语言开发一个心灵治愈交流平台 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述心灵治愈交流平台的当前背景以及系统开发的…

啥是MCU,MCU科普

啥是MCU&#xff0c;MCU科普 附赠自动驾驶学习资料和量产经验&#xff1a;链接 MCU是Microcontroller Unit 的简称&#xff0c;中文叫微控制器&#xff0c;俗称单片机&#xff0c;是把CPU的频率与规格做适当缩减&#xff0c;并将内存、计数器、USB、A/D转换、UART、PLC、DMA等…

Leetcode 42.接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#x…

发表SCI论文对作者学位职位有要求吗?

SCI论文是被SCI(Scientific Citation Index&#xff0c;《科学引文索引》)收录的期刊所刊登的论文。能够在SCI上成功发表论文是证明作者的一定的能力被国际研究界所认可&#xff0c;国内的很多科研人员因此对其也是非常向往的。 那么发表SCI论文对作者学位职位有要求吗? 通常…

基于单片机智能输液器监控系统的设计

**单片机设计介绍&#xff0c;基于单片机智能输液器监控系统的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机智能输液器监控系统的设计旨在实现对输液过程的实时监测和控制&#xff0c;以提高输液的安全性和疗效…

香港服务器与SEO的关系(香港服务器对SEO影响大吗?)

香港服务器与 SEO 的关系是一个备受关注的话题&#xff0c;不少站长在选择了香港服务器后&#xff0c;便会疑问&#xff1a;香港服务器对SEO的影响是否显著?那么&#xff0c;在这里就跟大家聊聊两者的关系以及影响大小。 其实&#xff0c;不少站长对 SEO 的这种担忧和想法是片…

InternLM2-lesson1

书生浦语大模型全链路开源体系 课程视频&#xff1a;https://www.bilibili.com/video/BV1Vx421X72D/ 开源历程 全面开源&#xff0c;免费商用&#xff01;&#xff01;&#xff01; internlm2模型体系 internlm2根据参数量可以分为7B和20B两个大的版本&#xff0c;每个大的…

Kubernetes篇(二)— 集群环境搭建

目录 前言一、 环境规划集群类型安装方式主机规划 二、环境搭建主机安装环境初始化安装docker安装kubernetes组件准备集群镜像集群初始化安装网络插件 三、 服务部署 前言 本章节主要介绍如何搭建kubernetes的集群环境 一、 环境规划 集群类型 kubernetes集群大体上分为两类…

qt窗口的应用与pyinstaller打包APP操作

3月29日 qt打包APP操作 1 先在windows shell 中下载打包软件Pylnstaller pip install pyinstaller2 先进入py项目所在的位置&#xff0c;再执行以下代码(我用的qt版本是PySide6可以根据自己的情况修改) pyinstaller s02.py --noconsole --hidden-import PySide6.QtXml3 因为…