前言
在上一章节中,一一哥 已经带大家认识了 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: yyg
password: 123
复制代码
7.2 setPassword()源码分析
在这里配置了自定义的用户名和密码后,在 Spring Security 的源码中,会通过调用 SecurityProperties 的 set()方法 注入到对应的属性中。我们来看下 SecurityProperties.User#setPassword() 方法的源码:
由此我们可以看到,passwordGenerated 属性变成了 false,结合上文的源码分析,我们就知道在控制台不会再输出打印密码信息了。
8. 重启项目
接着我们重启项目,这时候利用我们自己配置的用户名和密码,就可以访问"/hello"接口了。
这样我们只需要添加一个 security 的依赖包,就可以实现 Web 安全控制了。
这样,一一哥 就带大家实现了第一个 Spring Security 案例,你会发现,其实代码很简单,添加必要的依赖包,对登录账户做必要的配置就可以了。不知道第一个案例,你是学会了还是学废了?可以留言评论,告诉 一一哥,我会在后面对内容进行必要的优化!
评论