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

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.hqwc.cn/news/643341.html

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

相关文章

好看的混淆矩阵

网上绘制的混淆矩阵都不太满意。。。经过本人多次实验&#xff0c;如下混淆矩阵最为美观&#xff0c;特此记录 import matplotlib matplotlib.use(Agg) from matplotlib import rcParamsimport matplotlib.pyplot as plt import numpy as np# 给定混淆矩阵 cm np.array([[683…

5000字干货:如何通过社区驱动增长?挑战、认知、本质和六个步骤!

本来不少平台建立社区是为了给用户提供归属感,但在商业压力下,不得不开始做增长的运营。但不是说只是简单地“做增长”就可以的,归属感和增长,两者看起来相似,但生产流程却完全不同。这种情况下,我们需要怎么做? 2024年经济压力下,CEO向各社区负责人下达了一个目标:实…

解决“找不到MSVCP120.dll”或“MSVCP120.dll丢失”的错误方法

在计算机使用过程中&#xff0c;遇到诸如“找不到MSVCP120.dll”或“MSVCP120.dll丢失”的错误提示并不罕见。这类问题往往会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。本文旨在详细阐述MSVCP120.dll文件的重要性、其丢失的可能原因&#xff0c;以及解决方法&a…

力扣HOT100 - 543. 二叉树的直径

解题思路&#xff1a; class Solution {int ans;//记录节点数public int diameterOfBinaryTree(TreeNode root) {ans 1;depth(root);return ans - 1;//节点数减 1 就是路径长度}public int depth(TreeNode root) {if (root null) return 0;int l depth(root.left);int r de…

docker容器内彻底移除iptables服务的实现方法

背景 我创建的容器使用的是centos6的标准镜像&#xff0c;所以内置了iptables服务。容器启动后iptables服务默认就启动了。iptables设置的规则默认是所有流量都无法通行。而对于服务器的管理使用的是宿主机的防火墙。这样就导致在实现用iptables动态给容器添加端口映射时不成功…

STM32单片机C语言模块化编程实战:按键控制LED灯并串口打印详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 虽然这里演示的是STM32F407&#xff0c;但是ST…

ClickHouse用UDF解析XML字符串和XML文件

一.如果是读取xml文件的时候&#xff0c;文件入库需要使用文件读取UDF 创建了1个测试文件 wsdFileRead()&#xff1a; 直接读取文件内容 SELECT wsdFileRead(/home/temp/wsd_test.xml)Query id: 09b6e5fe-7169-43f7-b001-90e2eeabb8da┌─wsdFileRead(/home/temp/wsd_test.xm…

关于c++中的操作符:new和delete

目录 1.什么是new和delete 2.new和delete的用法 2.1 new和delete普通用法 2.2 new和delete的升级用法 1.什么是new和delete C语言中有两个函数用于动态开辟、释放内存----malloc和freec中又引入了两个操作符----new和delete来用于开辟、释放内存 说到这应该对这两个操作符有…

西电超算使用方法-简易版

一、引言 西电超算不错&#xff0c;我很喜欢。本文仅供自己学习使用。 二、环境搭建 搭建环境需要有一些依赖库&#xff0c;但是其实西电超算说明手册并没有写的非常清楚。因此&#xff0c;这次实战演示一下&#xff0c;写一个运行sh文件脚本并提交作业。 1、选择GPU还是CP…

JAVA:Kettle 强大的开源ETL工具

请关注微信公众号&#xff1a;拾荒的小海螺 1、简述 Kettle&#xff08;Pentaho Data Integration&#xff09;&#xff1a;强大的开源ETL工具Kettle&#xff0c;又称作Pentaho Data Integration&#xff0c;是一款流行的开源ETL&#xff08;Extract, Transform, Load&#x…

mysql之执行流程图

今天有刷了一篇小林coding的MYSQL图解,写的是真好,自己根据自己的理解画了一张,整理下来真的感觉收获不少,嗯,坚持输出! 小林coding传送门: 执行一条 select 语句&#xff0c;期间发生了什么&#xff1f; | 小林coding (xiaolincoding.com)

Hdu1350 Taxi Cab Scheme 【最小路径覆盖】

Taxi Cab Scheme 题意 有一张边长不超过 200 200 200 的网格图&#xff0c;有若干个乘客&#xff0c; 乘客 i i i 的需求是&#xff1a; h h : m m , ( a , b ) , ( c , d ) hh:mm, (a,b) , (c, d) hh:mm,(a,b),(c,d)&#xff0c;意为他需要在 h h 时 m m 分 hh时mm分 hh时…