Spring Security官方文档:https://spring.io/projects/spring-security#learn

一、Spring Securit简介

Spring Security 是一个安全框架,前身是 Acegi Security,它提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。

Spring Security 采用 IoC 和 AOP思想,基于 Servlet 过滤器实现的安全框架、为 Web 请求和方法调用提供身份确认和授权处理,还提供与其他库的集成以简化其使用,避免了代码耦合,减少了大量重复代码工作。

Spring Security 最最核心的功能就是两方面:

  • 认证 Authentication
  • 授权 Access Control

1、认证

用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。

常见的用户身份认证方式有:

  • 用户名密码登录
  • 二维码登录
  • 手机短信登录
  • 指纹认证等方式。

系统为什么要认证?
认证是为了保护系统的隐私数据与资源,用户的身份合法方可访问该系统的资源。

Spring Security 为身份验证提供了全面的支持。一旦执行身份验证通过之后,我们就知道用户身份并可以执行授权。
Spring Security 支持多种不同的认证方式,比如:

  • 单点登录。
  • 记住我登录(允许一些非敏感操作)。
  • 匿名登录。
  • 第三方登录
  • 也可以自定义认证逻辑等

2、授权

授权是用户认证通过后,根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则正常访问,没有权限则拒绝访问。
Spring Security 支持基于 URL 的请求授权、支持方法访问授权以及对象访问授权等。

为什么要授权?

  • 认证是为了保证用户身份的合法性;
  • 授权则是为了更细粒度的对隐私数据进行划分,授权是在认证通过之后发生的,控制不同的用户能够访问不同的资源。

二、入门案例

1、测试项目

新建一个 Spring Boot 项目,引入 Spring Security 依赖和 web 依赖。

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

1)编写 controller测试接口

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}

接下来什么事情都不用做,yml配置文件自定义端口为9090。

然后启动项目访问 测试接口,此时自动重定向到登录页面。

ruoyi spring security新用法 spring security详解_Spring Security


在启动过程中,我们会在控制台看到如下一行日志:

Using generated security password: 89e2fbee-9545-4812-affc-c2aeaed3d672

这就是 Spring Security 为默认用户 user 生成的临时密码,是一个 UUID 字符串。

2)输入user,和控制台生成的登录密码,登录后访问到测试接口。

ruoyi spring security新用法 spring security详解_spring_02

2、 默认登录用户信息

在 Spring Security 中,默认的登录页面和登录接口,都是 /login ,只不过一个是 get 请求(登录页面),另一个是 post 请求(登录接口)。

默认的用户信息:

  • 默认的用户名:就是 user,
  • 默认的登录密码:就是项目启动时控制台打印出来的 UUID字符串,

为什么默认用户信息是它?
UserDetailsServiceAutoConfiguration类(用户相关的自动化配置类)的 getOrDeducePassword 方法中,可以发现:用户信息在SecurityProperties类中是写死的。

  • 默认的用户名就是 user,
  • 默认的密码则是 UUID,
  • 默认情况下,passwordGenerated 也为 true,即打印用户密码。

ruoyi spring security新用法 spring security详解_spring_03

1.2 配置用户信息

通过配置文件或者配置类,在内存或者连接数据库中设置用户信息。
这里简单点,使用配置文件在 内存中设置用户信息。

在 application.yaml 配置文件中设置默认的用户名密码。

spring:
  security:
    user:
      name: admin
      password: admin123

SecurityProperties类查看用户信息,发现我们指定密码的同时还设置了 passwordGenerated 属性为 false,所以控制台不会打印的密码信息了。

ruoyi spring security新用法 spring security详解_spring_04

– 求知若饥,虚心若愚。