什么是Spring Security?具有哪些功能?

news2024/11/27 4:19:42

71493b2b6cba47970e0c262257790355.gif

本篇将带你快速了解什么是Spring Security,通过入门案例以及相关原理和类的分析让你快速入门。

069f9a66efb770c35aea2dc7e17a0068.jpeg

一、概述

官网:https://spring.io/projects/spring-security

Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。

身份认证是验证谁正在访问系统资源,判断用户是否为合法用户。认证用户的常见方式是要求用户输入用户名和密码。

授权是指用户进行身份认证后,系统会控制谁能访问哪些资源。用户无法访问没有权限的资源。

防御常见攻击:如CSRF、HTTP Headers、HTTP Requests

比如我们打开网页版京东进行登录,可以使用密码登录、短信登录、QQ登录、微信登录以及扫码登录几种方式。用户登录的过程其实就是一个身份认证的过程。

6ae50c572e4a9ad32b007555a4505843.png

普通用户登录京东后,可以查看商品,加购物车,结算订单等,这些都是系统授予普通用户资源访问的权限。

二、入门案例

1、入门准备

这里我们参考官方文档来完成一个简单的Spring Security入门案例。

官方文档:https://springdoc.cn/spring-security/servlet/getting-started.html

1c1fa9bc69428996e1ee7a39841c0d66.png

点击示例库,进入如下目录

3eeb5564eb67ad16897b4d0d7e9ad98c.png

目录下对应的代码如下

1)Application启动类:

HelloSecurityApplication.java

package example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloSecurityApplication {

 public static void main(String[] args) {
  SpringApplication.run(HelloSecurityApplication.class, args);
 }
}

2)Controller控制类:

IndexController.java。可以看到里面有一个index方法,返回了一个视图解析index

package example;

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

@Controller
public class IndexController {

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

3)index.html,用到了thymeleaf模板语法

<html xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Hello Security!</title>
</head>
<body>
    <h1>Hello Security</h1>
    <a th:href="@{/logout}">Log Out</a>
</body>
</html>

注:Thymeleaf是一个现代服务器端Java模板引擎,适用于Web和独立环境。

2、创建SpringBoot工程,编写代码

打开IDEA,创建SpringBoot工程,如下

d117723f1ba422237318089166567f1d.png

添加对应依赖,完成后点击Finish等待联网创建

751f4d7dcfe669262f3539aa0a1d16b7.png

如果在创建工程时忘记添加,也可以自己手动在pom.xml文件中添加依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity6</artifactId>
        </dependency>

创建controller包并在包下创建IndexController控制类,并在templates目录下创建一个index.html文件,代码可以参考上述官方文档模板里面的。

cb2572f51cafad15144df22a59a6ee73.png

注:index.html里面使用动态链接的好处是:如果应用程序发布在了不同的目录下,thymeleaf的标签会做自动的相对路径的处理,而普通的a标签则不会。很好理解,动态的好处就是更加灵活方便。

3、启动运行,校验登录

启动项目,浏览器访问 http://localhost:8080/ ,用户名默认为user,密码为控制台输出的一串

9266ebafed29e701889bc5dcf52b924d.png

访问后,会自动进入如下登录页进行身份认证

7564631e1ead848d9fa156180af266fc.png

输入用户名和密码,登录进去后如下

07742b2d9b30c6dd31f6d9e5f5691970.jpeg

点击Log Out后,提示如下

b4528da0784c68de5ee0e4ad812d1077.jpeg

此时再次点击Log Out后,就会退回到刚开始的登录页。

4、案例总结

通过上述简单的入门案例,可以得出Spring Security要求对应用程序的任何交互进行身份验证。具体如下:

1)程序启动时生成一个默认用户“user”。

2)生成一个默认的随机密码,并将此密码记录在控制台上。

3)生成默认的登录表单和注销页面。

4)提供基于表单的登录(Sign in)和注销(Log Out)流程。

5)对于web请求,重定向到登录页面(http://localhost:8080/login);

三、底层相关原理

几个关键核心的部分如下:

1)DelegatingFilterProxy:作为过滤器的代理,能够帮助我们调用Spring容器中所有注册的过滤器。

2)FilterChainProxy:能够帮助我们管理多个不同的过滤器链。

3) SecurityFilterChain(0)~SecurityFilterChain(n):能够帮助我们处理复杂的业务逻辑。

当不同的客户端请求发送到服务端时,通过匹配不同的URL,由不同的过滤器组合来接收,从而实现由不同的过滤器来完成不同的业务功能。

9cf9d7bfc14376abd6755f74ec2831d3.jpeg

四、程序启动运行相关的类

1、DefaultSecurityFilterChain

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

可通过添加断点的方式进行追踪:在IDEA中 Ctrl + N,输入DefaultSecurityFilterChain进行检索,点击即可进入查看源码。在35行处添加断点,重新启动调试项目。

e3f45c2b2332252e3dd513600499893e.png

注:使用快捷键 Ctrl + N可以快速检索类/文件。

2、SecurityProperties

初始化配置,配置了默认的用户名(user)和密码(uuid)

同理,在IDEA中 Ctrl + N,输入SecurityProperties进行检索,点击即可进入查看源码。

f9fb9adafbb31e3f68a904783087f400.png

在application.properties中配置自定义用户名和密码

62daf0d655029cbbc860d6b89a8cf4e6.jpeg

配置完成后,重启项目,访问 http://localhost:8080/ ,就可以用自己配置好的用户名和密码登录了。

e5c4b0b2aaf748349c19d239111be6d4.gif

aac6d85c4458724d796a36d438505c6d.jpeg

面试官:AOP有哪些使用场景?如何实现Spring事务?事务失效场景有哪些?

2cb833c076c616c65bb338d71a6e4146.jpeg

什么是redis的缓存穿透,缓存击穿和缓存雪崩?

7b75d8c936bab8e0648129b3ae6bb392.jpeg

什么是redis? 如何在SpringBoot中集成和操作redis?

54c7884c81e31e0a9e8f682ff05f7b1d.jpeg

什么是对象存储OSS?怎么利用OSS实现文件上传?


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

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

相关文章

【洛谷 P3366】【模板】最小生成树 题解(无向图+边集数组+Kruskal算法+最小生成树+并查集+路径压缩)

【模板】最小生成树 题目描述 如题&#xff0c;给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出 orz。 输入格式 第一行包含两个整数 N , M N,M N,M&#xff0c;表示该图共有 N N N 个结点和 M M M 条无向边。 接下来 M M M 行…

每日学习笔记:C++ STL算法之容器赋值与替换元素

本文API 赋值 fill(beg, end, newValue) fill_n(beg, num, newValue) generate(beg, end, op) generate_n(beg, num, op) iota(beg, end, startValue) 替换元素 replace(beg, end, oldValue, newValue) replace_if(beg, end, op, newValue) replace_copy(sourceBeg, sourceEnd,…

3个最常用的游戏资产优化技巧【BLENDER】

创建视频游戏资产既具有挑战性又富有回报。 经过一些研究并根据我的经验&#xff0c;这里有三个技巧可以帮助你使用 Blender 优化游戏资产。 在 Blender 中优化游戏资源的三种技术可以归结为拥有高效的 3D 模型拓扑、通过烘焙优化纹理&#xff0c;以及最后通过 Blender 节点的…

恢复回收站删除的文件?5个恢复技巧收藏好!

电脑回收站是一个重要的系统工具&#xff0c;它为用户提供了便捷的文件和文件夹管理功能&#xff0c;主要功能有存储临时删除的文件、恢复已删除的文件等。它能帮助用户更好地管理和控制电脑文件和文件夹。 在使用电脑的过程中&#xff0c;我们难免会遇到误删文件的情况&#…

使用python进行网站答题操作

介绍&#xff1a; 使用Python和DrissionPage模块编写自动化脚本&#xff0c;以模拟人的行为访问网站并获取题目答案进行自动答题。这个脚本似乎是为答题网站设计的&#xff0c;通过监控特定数据包地址来获取题目答案&#xff0c;并模拟点击正确答案进行答题。 代码中的逻辑包…

美格智能出席紫光展锐第三届泛金融支付生态论坛,引领智慧金融变革向新

4月16日&#xff0c;以“融智创新&#xff0c;共塑支付产业新生态”为主题的紫光展锐第三届泛金融支付生态论坛在福州举办&#xff0c;来自金融服务机构、分析师机构、终端厂商、模组厂商等行业各领域生态伙伴汇聚一堂&#xff0c;探讨金融支付产业的机遇与挑战。作为紫光展锐重…

基于SpringBoot的“网上商城购物系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“网上商城购物系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 网上商城购物系统结构图 管理员登录界面图 个…

JAVAEE—UDP协议TCP协议/三次握手四次挥手

文章目录 UDP协议UDP协议的段格式UDP的传输过程校验和无连接 TCP协议TCP报文的格式段有连接可靠性确认应答超时重传如果ACK丢了呢&#xff1f; 序号和确认序号 连接的构建和断开连接的构建&#xff08;三次握手&#xff09;三次握手的作用为什么握手是三次&#xff0c;而不是四…

Java面试题笔记(持续更新)

Java基础 java中的Math.round(-1.5)等于多少&#xff1f; Math的round方法是四舍五入,如果参数是负数,则往大的数如,Math.round(-1.5)-1&#xff0c;如果是Math.round(1.5)则结果为2 JDK和JRE的区别&#xff1f; JDK 是 Java Development ToolKit 的简称&#xff0c;也就是…

网络协议——IS-IS协议详解

1. IS-IS是什么 IS-IS是一种基于链路状态并使用最短路径优先算法进行路由计算的一种IGP协议。IS-IS属于内部网关协议&#xff0c;用于自治系统内部。IS-IS是一种链路状态协议&#xff0c;使用最短路径优先算法进行路由计算。 2. 应用场景&#xff08;园区网和骨干网&#xff0…

IPAguard--iOS代码混淆工具(免费)

IPAguard是一款为iOS开发者设计的代码混淆工具&#xff0c;旨在为开发者提供方便制作和分析马甲包的解决方案。通过高效的匹配算法&#xff0c;IPAguard可以在保证代码混淆的同时&#xff0c;保证编译后的代码质量&#xff0c;减少了因混淆引起的bug&#xff0c;使得开发者能够…

Java学习-详述main方法、可变参数、数组的工具类、二维数组

详述main方法 【1】main方法&#xff1a;程序的入口&#xff0c;在同一个类中&#xff0c;如果有多个方法&#xff0c;那么虚拟机就会识别main方法&#xff0c;从这个方法作为程序的入口 【2】main方法格式严格要求&#xff1a; public static void main(String[] args){} p…

C#版Facefusion:让你的脸与世界融为一体!-01 人脸检测

C#版Facefusion&#xff1a;让你的脸与世界融为一体&#xff01;-01 人脸检测 目录 说明 效果 模型信息 项目 代码 下载 说明 C#版Facefusion一共有如下5个步骤&#xff1a; 1、使用yoloface_8n.onnx进行人脸检测 2、使用2dfan4.onnx获取人脸关键点 3、使用arcface_w60…

Java——继承的初步认识

目录 一.为什么需要继承 二.继承概念 三.继承的语法 四.父类成员访问 1.子类中访问父类的成员变量 1.1子类和父类不存在同名成员变量 1.2子类和父类成员变量同名 2.子类中访问父类的成员方法 2.1成员方法名字不同 2.2成员方法名字相同 五.super关键字 六.子类构造…

【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用(图文并茂超详细介绍)

往期回顾 【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框-CSDN博客 【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左&#xff0c;文本水平的效果-CSDN博客【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍-CSDN博客 【QT进阶】Qt Web混合编…

敬请关注 | 第五届隆道数智大会——2024数字化采购与供应链发展论坛即将开幕

数智赋能 创新驱动 第五届隆道数智大会 ——2024数字化采购与供应链发展论坛 即将开幕&#xff01; 近200位采购与供应链、数字技术领域 专家、学者及行业领军企业的实践者 将齐聚本届盛会 解读产业政策落地 聚焦采购与供应链数字化创新发展态势 探讨AI、大数据在企业…

聚观早报 | 小度推出DuerOS X;问界新M5开启预定

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月18日消息 小度推出DuerOS X 问界新M5开启预定 库克访问印尼 方程豹产品矩阵正式发布 苹果折叠屏iPhone新专利…

实验室信息系统源码 saas模式java+.Net Core版开发的云LIS系统全套源码可二次开发有演示

实验室信息系统源码 saas模式java.Net Core版开发的云LIS系统全套源码可二次开发有演示 一、技术框架 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C# 6.0、JavaScript 前端框架&#xff1a;JQuery、EasyUI、Bootstrap 后端框架&am…

Python 全栈 Web 应用模板:成熟架构,急速开发 | 开源日报 No.223

tiangolo/full-stack-fastapi-template Stars: 15.6k License: MIT full-stack-fastapi-template 是一个现代化的全栈 Web 应用模板。 使用 FastAPI 构建 Python 后端 API。使用 SQLModel 进行 Python SQL 数据库交互&#xff08;ORM&#xff09;。Pydantic 用于数据验证和设…

JavaSE——常用API进阶二(5/8)-JDK 8新增的时间API,LocalDate、LocalTime、LocalDateTime

目录 JDK 8新增的时间API LocalDate、LocalTime、LocalDateTime 获取对象的方案 案例演示 ​编辑 LocalDateTime的不同 常用API总结 为什么要学JDK 8 新增的时间&#xff1f; JDK 8之前传统的时间API 设计不合理&#xff0c;使用不方便&#xff0c;很多都被淘汰了。都…