Springboot +spring security,创建SpringSecurity项目

news2025/1/6 20:14:57

一.简介

搭建第一个Spring Security项目,看看如何利用Spring Security来保护Java Web项目。

二. 创建SpringSecurity项目

我们这边使用idea进行创建。

2.1创建一个基于Maven的Project项目。

在这里插入图片描述
在这里插入图片描述

2.2设置项目名称和存储位置

在这里插入图片描述
在这里插入图片描述

2.3添加项目依赖

在pom.xml文件中,配置依赖,代码如下:

<properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
    <spring-platform.version>Cairo-SR3</spring-platform.version>
</properties>
 
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
 
        <!--BOM(bill of materials):材料清单,用于解决jar包依赖的好方法-->
            <!--缘起:Spring现在已发展成一个庞大体系。比如security、mvc等。如此一来,不同模块或者与外部进行集成时,
            依赖处理就需要各自对应版本号。比如,较新spring与较老的quartz,它们集成就会遇到问题,给搭建和升级带来不便。
            因此Spring IO Platform应运而生,只要项目中引入了它,外部集成时依赖关系无需版本号。-->
        <dependency>     
             <groupId>io.spring.platform</groupId>
             <artifactId>platform-bom</artifactId>
             <version>${spring-platform.version}</version>
             <type>pom</type>
             <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
 
<dependencies>
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
 
   <!--核心安全依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
 
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
      </dependency>
   </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
    <!--配置中央仓库-->
    <repositories>
        <repository>
            <id>aliyun-repos</id>
            <url>https://maven.aliyun.com/repository/public</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
</repositories>

三.代码实现

3.1创建项目入口类

启动类代码如下:


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class Demo01Application {
 
    public static void main(String[] args) {
        SpringApplication.run(Demo01Application.class, args);
    }
 
}

3.2创建web接口

HelloController类的代码如下:


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class HelloController {
 
    @GetMapping("/hello")
    public String hello() {
        return "德玛西亚";
    }
 
}

四.功能验证

4.1启动项目

我们把项目启动起来后,在浏览器中对Web接口进行访问,会发现接口是无法直接访问的。在访问接口之前会自动跳转到"/login"地址,进入到一个登录界面。这是因为Spring Boot中"约定大约配置"的规则,只要我们添加了Spring Security的依赖包,就会自动开启安全限制,在访问Web接口之前会进行安全拦截。只有输入了用户名和密码,才能访问项目中的Web接口。
在这里插入图片描述
此时登录界面中,要求我们输入用户名和密码。这个默认的用户名是“user”,密码是一个用UUID生成的随机字符串。在每次启动项目时,都可以在控制台中看到生成的随机密码,截图如下:
在这里插入图片描述

4.2随机密码生成机制

这个随机的密码到底是在哪里生成的呢?这个默认的用户名和密码其实是在SecurityProperties类中定义的,截图如下:
在这里插入图片描述
而控制台上打印的密码日志,是在UserDetailsServiceAutoConfiguration类的getOrDeducePassword()方法中输出的

只要把这个随机密码,复制粘贴到登录页面的密码框中,就可以访问"/hello"接口了。

4.3配置Security账户

从上面的源码分析可知,默认的登录密码是利用UUID生成的随机字符串,如果使用这个字符串作为登录密码,就比较麻烦。所以Security框架允许我们自己配置用户名和密码,并且提供了2种方式来进行自定义用户名和密码:

  1. 在配置文件中定义
  2. 在配置类中定义

4.3.1在配置文件中定义

这篇文章中我们先采用配置文件的方式来进行实现,首先创建一个application.yml配置文件,配置如下:

spring:
  security:
    user:
      name: demaxiya
      password: 123

4.3.2setPassword()源码分析

在这里配置了自定义的用户名和密码后,在Spring Security的源码中,会通过调用SecurityProperties的 set()方法 注入到对应的属性中。SecurityProperties.User#setPassword() 方法的源码截图如下:
在这里插入图片描述

4.4重启项目

重启项目,这时候利用我们自己配置的用户名和密码,就可以访问"/hello"接口了。

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

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

相关文章

LeetCode 128 最长连续序列

LeetCode 128 最长连续序列 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/longest-consecutive-sequence/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给定一个未排…

【双系统ubuntu安装指引】配置一个顺手的深度学习环境

文章目录 前言1. 前置安装 前言 版本&#xff1a;ubuntu20.04 桌面版 normal安装 第一件事&#xff0c;切换源&#xff1a;换成阿里源 https://blog.csdn.net/u010092716/article/details/125832062 第二件事输入法安装&#xff0c;指引在这里 https://blog.csdn.net/q54434431…

JMeter性能测试:JMeter多用户并发模拟及压测结果分析

目录 JMeter设置 JMeter线程组 JMeter压测实例 View Results Tree Aggregate Report 命令行方式执行压测 jtl文件解析 JMeter多用户并发模拟 JMeter设置 多用户并发数的多少与计算机内存有关&#xff0c;设置 jmeter.bat (Windows) 或者 jmeter.sh (Linux)&#xff1a;…

chapter6:SpringBoot与Docker

1. 简介 Docker是一个开源的轻量级应用容器引擎, 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到Linux机器中实现虚拟化。(沙箱机制) Docker支持将软件编译成一个镜像&#xff1b;然后在镜像中各种软件做好配置&#xff0c;将镜像…

《数据库系统概论》期末考试手写笔记汇总+考试注意事项+反思(超全整理总结!!!)

&#xff08;一&#xff09;期末考试手写笔记汇总 笔记内容为期末考试前整理&#xff08;结合测试题PPT作业题目课本&#xff09; 很多内容为纯手写&#xff0c;非常的全乎&#xff0c;预祝你期末可以考个好成绩&#x1f339; 第二章第三章&#xff08;25分&#xff09; (…

JS 深度克隆的实现方法

方法一&#xff1a;正统做法&#xff08;扩展性高&#xff0c;推荐&#xff09; function test() { this.a 1; this.b 2; } test.prototype.c 3; // 原型上的属性 const obj new test(); console.log("原对象", obj); console.log("克隆后的对象", dee…

Flume系列:案例-Flume负载均衡和故障转移

目录 Apache Hadoop生态-目录汇总-持续更新 逻辑&#xff1a; 2&#xff1a;案例需求-实现故障转移 3&#xff1a;实现步骤&#xff1a; 2.1&#xff1a;实现flume1.conf 2.2&#xff1a;实现flume2.conf - 端口4141 2.3&#xff1a;实现flume3.conf - 端口4142 3&#…

NIO编程总结

NIO&#xff08;Non-blocking I/O&#xff0c;在Java领域&#xff0c;也称为New I/O&#xff09;&#xff0c;是一种同步非阻塞的I/O模型&#xff0c;也是I/O多路复用的基础&#xff0c;已经被越来越多地应用到大型应用服务器&#xff0c;成为解决高并发与大量连接、I/O处理问题…

【如何在Java中使用ForkJoinPool】

目录 背景1.使用ForkJoinPool的线程池2.工作窃取算法3.ForkJoinPool的主要类4.使用递归操作5.资源任务6.何时使用ForkJoinPool7.总结 背景 使用ForkJoinPool去分解计算密集型任务且且并行地执行他们以获得更好的Java应用程序的性能。 ForkJoinPool是一个功能强大的Java类&…

程序员进银行科技岗——简单总结

银行的分类 Top0—中央银行&#xff1a; 仅有一家&#xff0c;即中国人民银行。 Top1—政策性银行&#xff1a; 国家开发银行、中国进出口银行、中国农业发展银行 Top2—国有商业银行&#xff1a; 国有六大行&#xff08;中国工商银行、中国农业银行、中国银行、中国建设…

【计算机网络】前后端分离,HTTP协议,网络分层结构,TCP

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 前后端分类HTTP协议HTTP组成HTTP的版本HTTP的请求方式HTTP请求头HTTP 响应状态码 AJAX发送请求 …

555定时器的基本原理和应用案例

前言 555定时器常用于脉冲波形的产生和整形电路中&#xff0c;之前在查找555定时器的原理图和基本管脚信息时&#xff0c;网上的内容大多含糊不清&#xff0c;没有讲的很详细&#xff0c;要么只是单一的管脚图&#xff0c;要么就是简单的文字解释&#xff0c;并且大多数缺乏基…

2023 年大厂实习前端面试题(一):跨域问题

1. 跨域 1.1 跨域问题来源 跨域问题的来源是浏览器为了请求安全而引入的基于同源策略&#xff08;Same-origin policy&#xff09;的安全特性。 同源策略是浏览器一个非常重要的安全策略&#xff0c;基于这个策略可以限制非同源的内容与当前页面进行交互&#xff0c;从而减少…

linux 条件变量 pthread_cond_signal

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 简介 应用场景 与互斥量/信号量的区别 接口介绍 变量定义 初始化 等待被唤…

ROS:ROS的一些基本命令行

目录 一、打开小海龟1.1终端&#xff0c;启动ROS Master&#xff1a;1.2终端2&#xff0c;启动小海龟仿真器&#xff1a;1.3终端3&#xff0c;启动海龟控制节点&#xff1a; 二、查看系统中的计算图三、节点命令3.1查看节点下的命令rosnode3.2显示节点列表rosnode list3.3查看节…

[CISCN2023]unzip

[CISCN2023]unzip 环境搭建 1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><form method"post" action"1.php" en…

Java 基础进阶篇(十六):多线程总结

文章目录 一、多线程概述二、多线程的创建1.1 方式一&#xff1a;继承 Thread 类1.2 方式二&#xff1a;实现 Runnable 接口匿名内部类实现方案 1.3 方式三&#xff1a;JDK 5.0新增: 实现 Callable 接口1.4 三种方式对比 二、Thread的常用方法三、线程安全与同步3.1 线程安全3.…

数据类型.

数据类型 数据类型分类 数值类型 tinyint类型 数值越界测试&#xff1a; mysql> create table tt1(num tinyint); Query OK, 0 rows affected (0.02 sec)mysql> insert into tt1 values(1); Query OK, 1 row affected (0.00 sec)mysql> insert into tt1 values(128…

数据仓库基础(通俗易懂,好文)数仓概念

1、数据仓库的概念 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Support&#xff09…

CISCN WP ——R3vCr4ck

[CISCN-Misc] 签到卡 [CISCN-Misc] 被加密的生产流量 在过滤器中搜索modbus 发现类似base的编码 跟踪TCP流得到Base32密文 在线解密 [CISCN-Crypto]可信度量 非预期解 分析题目&#xff0c;发现修改程序后的测试程序位于容器内&#xff0c;使用winscp通过scp连接容器&#xff…