乐趣区

关于java:选择排序底层原理详解

一. 搭建 SpringBoot 开发环境

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

  1. 创立 SpringBoot 我的项目如各位对 SpringBoot 根底不相熟,请参考自己的 SpringBoot 系列教程:blog.csdn.net/syc000666/a…SpringBoot 我的项目的具体创立过程如下图所示。

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

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

  1. 增加我的项目依赖在 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. 我的项目目录构造此时咱们的我的项目包构造如下图所示:

  1. 启动我的项目咱们把我的项目启动起来后,在浏览器中对 Web 接口进行拜访,会发现接口是无奈间接拜访的。在拜访接口之前会主动跳转到 ”/login” 地址,进入到一个登录界面。这是因为 Spring Boot 中 ” 约定大概配置 ” 的规定,只有咱们增加了 Spring Security 的依赖包,就会主动开启平安限度,在拜访 Web 接口之前会进行平安拦挡。只有输出了用户名和明码,能力拜访我的项目中的 Web 接口。

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

  2. 随机明码生成机制可能有小伙伴会很好奇,这个随机的明码到底是在哪里生成的呢?带各位剖析一下 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 安全控制了。

退出移动版