前言

在上一章节中,一一哥 已经带大家认识了Spring Security,对其基本概念已有所了解,但是作为一个合格的程序员,最关键的肯定还是得动起手来,所以从本篇文章开始,我就带大家搭建第一个Spring Security项目,看看如何利用Spring Security来保护我们的Java Web项目。

一. 搭建SpringBoot开发环境

我们的Spring Security系列教程会基于SpringBoot环境,并且以案例迭代的方式进行开发,所以为了方便后续案例的编写,我们先提前搭建一个SpringBoot环境的Web项目。

1. 创建SpringBoot项目

如各位对SpringBoot基础不熟悉,请参考本人的SpringBoot系列教程:

https://blog.csdn.net/syc000666/article/details/105086898?spm=1001.2014.3001.5502

SpringBoot项目的具体创建过程如下图所示。

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

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

2. 添加项目依赖

在pom.xml文件中,添加配置SpringBoot开发环境的依赖包。

<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-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>

添加完SpringBoot中主要的依赖包之后,我们就可以在这个环境中进行Web项目开发了。

二. 创建第一个SpringSecurity项目

我们在上面的SpringBoot开发环境中,创建出第一个SpringSecurity模块,具体创建过程略(嘿嘿)。

1. 添加模块中的pom依赖

我们在该module中,添加项目开发时必要的依赖包,主要是添加SpringSecurity的依赖包,在这里会完美体现SpringBoot中”约定大于配置“的思想哦。

<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>
</dependencies>

2. 创建web接口

接下来我们随便编写一个web接口,方便后面进行测试。

package com.yyg.security.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "Hello, 来跟 一一哥 学习 Spring Security吧!";}}

3. 创建项目入口类

package com.yyg.security;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);}}

4. 项目目录结构

此时我们的项目包结构如下图所示:

5. 启动项目

我们把项目启动起来后,在浏览器中对Web接口进行访问,会发现接口是无法直接访问的。在访问接口之前会自动跳转到"/login"地址,进入到一个登录界面。这是因为Spring Boot中"约定大约配置"的规则,只要我们添加了Spring Security的依赖包,就会自动开启安全限制,在访问Web接口之前会进行安全拦截。只有输入了用户名和密码,才能访问项目中的Web接口。

此时登录界面中,要求我们输入用户名和密码。这个默认的用户名是“user”,密码是一个用UUID生成的随机字符串。在每次启动项目时,都可以在控制台中看到生成的随机密码,如下图所示:

6. 随机密码生成机制

可能有小伙伴会很好奇,这个随机的密码到底是在哪里生成的呢?一一哥 带各位分析一下Spring Security的源码,来看看这个密码的生成策略。这个默认的用户名和密码其实是在SecurityProperties类中定义的,源码如下图:

而控制台上打印的密码日志,是在UserDetailsServiceAutoConfiguration类的getOrDeducePassword()方法中输出的。

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

7. 配置Security账户

从上面的源码分析可知,默认的登录密码是利用UUID生成的随机字符串,很明显如果我们使用这个字符串作为登录密码,就太麻烦了。那么有没有更方便的登录账户呢?作为一个框架,我可以很负责的告诉各位,这肯定是有的!

所以Security框架允许我们自己配置用户名和密码,并且提供了2种方式来进行自定义用户名和密码:

  • ①. 在配置文件中定义;
  • ②. 在配置类中定义。

7.1 配置用户信息

在本案例中 一一哥 带各位采用配置文件的方式来进行实现,首先我们创建一个application.yml配置文件,配置如下:

spring:security:user:name: yygpassword: 123

7.2 setPassword()源码分析

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

由此我们可以看到,passwordGenerated属性变成了false,结合上文的源码分析,我们就知道在控制台不会再输出打印密码信息了。

8. 重启项目

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

这样我们只需要添加一个security的依赖包,就可以实现Web安全控制了。

这样,一一哥 就带大家实现了第一个Spring Security案例,你会发现,其实代码很简单,添加必要的依赖包,对登录账户做必要的配置就可以了。不知道第一个案例,你是学会了还是学废了?可以留言评论,告诉 一一哥,我会在后面对内容进行必要的优化!

Spring Security系列教程03--创建SpringSecurity项目相关推荐

  1. Spring Security系列教程解决Spring Security环境中的跨域问题

    原创:千锋一一哥 前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题. ...

  2. Spring Security系列教程11--Spring Security核心API讲解

    前言 经过前面几个章节的学习,一一哥 带大家实现了基于内存和数据库模型的认证与授权,尤其是基于自定义的数据库模型更是可以帮助我们进行灵活开发.但是前面章节的内容,属于让我们达到了 "会用&q ...

  3. Spring Security系列教程-Spring Security核心API讲解

    前言 经过前面几个章节的学习,一一哥 带大家实现了基于内存和数据库模型的认证与授权,尤其是基于自定义的数据库模型更是可以帮助我们进行灵活开发.但是前面章节的内容,属于让我们达到了 "会用&q ...

  4. Spring Security系列教程18--会话管理之防御固定会话攻击

    前言 在前面几个章节中,一一哥 带各位学习了如何实现基于数据库进行认证授权,如何给登录界面添加图形验证码,如何进行自动登录和注销登录,那么Spring Security的功能难道只有这些吗?肯定不是的 ...

  5. Spring Security系列教程21--会话管理之实现集群会话

    前言 现在我们已经掌握了如何防御会话固定攻击,处理会话过期,对会话进行并发控制等,但是这些会话处理手段都是针对单机环境下的,在现在的大型项目中,很多时候都是采用分布式开发方案.一旦涉及到分布式方案,就 ...

  6. 千锋教育威哥学Java——爆破专栏丨Spring Security系列教程之解决Spring Security环境中的跨域问题

    前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题. 需要更多教程,微信 ...

  7. 爆破专栏丨Spring Security系列教程之实现CAS单点登录上篇-概述

    作者:千锋一一哥 前言 从本章节开始,一一哥 会给各位讲解一个很常见也很重要的知识点,就是单点登录!现在的大型分布式项目,基本都会考虑实现单点登录,而且现在网上也有很多单点登录的实现方案.开源项目,但 ...

  8. java培训爆破专栏之Spring Security系列教程之实现CAS单点登录上篇-概述

    作者:千锋一一哥 前言 从本章节开始,一一哥 会给各位讲解一个很常见也很重要的知识点,就是单点登录!现在的大型分布式项目,基本都会考虑实现单点登录,而且现在网上也有很多单点登录的实现方案.开源项目,但 ...

  9. Spring Security 示例教程

    Spring Security 示例教程 Spring Security提供了在Web应用程序中执行身份验证和授权的方法.我们可以在任何基于servlet的Web应用程序中使用spring secur ...

最新文章

  1. Django 2.1.3 中间件使用
  2. 科大讯飞语音转文字以及中文分词的Java测试代码
  3. Brute Force STL --- UVA 146 ID Codes
  4. 手工xxoo Visual Assist X 笔记
  5. JavaScript中函数的变量提升问题
  6. 习题2.4 递增的整数序列链表的插入(15 分)浙大版《数据结构(第2版)》题目集...
  7. mysql重做日志与binlog日志区别_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...
  8. “无代码”来了,还要程序员干嘛?
  9. Java后台开发精选知识图谱
  10. 乐优商城服务器部署_黑马乐优商城19天(全)+源码+配套笔记
  11. HMC5883L电子罗盘原理及应用,全网最详细~
  12. XP下微软雅黑粗体不起作用(不能显示)的解决方法
  13. github python100天_GitHub - CherryXuan/Python-100-Days: Python - 100天从新手到大师
  14. 你必须知道的html5的基本特征和用法--基础必会
  15. 中国最黑的十三个旅游景点
  16. Verilog --状态机编码方式
  17. Linux配置网络方法
  18. Spring 学习笔记----->AOP
  19. LVI-SAM坐标系外参分析与代码修改,以适配各种数据集
  20. python字典取值_python字典,python字典取值

热门文章

  1. RT-Thread— 知识点总结(RTT认证+面试题汇总)
  2. Android中的PID,UID,TID
  3. android root刷机包包,一加OnePlus 5T安卓9 root教程,用recovery来卡刷root包
  4. 高中计算机操作题frontpage步骤,计算机一级Frontpage操作试题
  5. 工具学习——有哪些好用的语音转文字app
  6. SUMO与matlab联合仿真
  7. win11文件后缀名怎么查看 Windows11查看文件后缀的设置方法
  8. mysql 页分裂_InnoDB中的页合并与分裂
  9. 几百块的投影仪靠谱吗?性能怎么样?
  10. 朱建辉php,“神采·朱建辉版画艺术展”在尼泊尔加德满都开幕