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。
然后启动项目访问 测试接口,此时自动重定向到登录页面。
在启动过程中,我们会在控制台看到如下一行日志:
Using generated security password: 89e2fbee-9545-4812-affc-c2aeaed3d672
这就是 Spring Security 为默认用户 user 生成的临时密码,是一个 UUID 字符串。
2)输入user,和控制台生成的登录密码,登录后访问到测试接口。
2、 默认登录用户信息
在 Spring Security 中,默认的登录页面和登录接口,都是 /login ,只不过一个是 get 请求(登录页面),另一个是 post 请求(登录接口)。
默认的用户信息:
- 默认的用户名:就是 user,
- 默认的登录密码:就是项目启动时控制台打印出来的 UUID字符串,
为什么默认用户信息是它?
在 UserDetailsServiceAutoConfiguration
类(用户相关的自动化配置类)的 getOrDeducePassword 方法中,可以发现:用户信息在SecurityProperties
类中是写死的。
- 默认的用户名就是 user,
- 默认的密码则是 UUID,
- 默认情况下,passwordGenerated 也为 true,即打印用户密码。
1.2 配置用户信息
通过配置文件或者配置类,在内存或者连接数据库中设置用户信息。
这里简单点,使用配置文件在 内存中设置用户信息。
在 application.yaml 配置文件中设置默认的用户名密码。
spring:
security:
user:
name: admin
password: admin123
在 SecurityProperties
类查看用户信息,发现我们指定密码的同时还设置了 passwordGenerated 属性为 false,所以控制台不会打印的密码信息了。
– 求知若饥,虚心若愚。