一.简介
搭建第一个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种方式来进行自定义用户名和密码:
- 在配置文件中定义
- 在配置类中定义
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"接口了。















![[CISCN2023]unzip](https://img-blog.csdnimg.cn/img_convert/d0e073c6d0630db679f232e437e0a3ae.png)



