ITPub博客

首页 > 数据库 > 数据库开发技术 > 爆破专栏丨Spring Security系列教程之创建项目

爆破专栏丨Spring Security系列教程之创建项目

原创 数据库开发技术 作者:Finally_m 时间:2021-09-10 18:20:00 0 删除 编辑

点击上方蓝字关注我们

前言

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

一. 搭建SpringBoot开发环境

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

1. 创建SpringBoot项目

如各位对SpringBoot基础不熟悉,可以关注公众号回复关键字【springboot】

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;
@RestControllerpublic 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;
@SpringBootApplicationpublic 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案例,你会发现,其实代码很简单,添加必要的依赖包,对登录账户做必要的配置就可以了。不知道第一个案例,你是学会了还是学废了?

  往期精彩  

爆破专栏丨Spring Security开发第一章!

HarmonyOS版锋迷商城APP视频教程

千锋老朱最全Springcloud-alibaba视频教程

《锋迷商城》电商项目大结局

《Java进阶之-Docker快速入门+实战》视频教程

文末福利

留言评论,高武我们需要优化的地方哦!

被采纳的同学获得水杯一个!

关注公众号,获取更多学习干货


点击【阅读全文】,从零开始学Java

原文作者:Java架构栈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-04-13

  • 博文量
    573
  • 访问量
    243748