Spring Security是什么?
Spring Security做什么?
- ⽤户信息管理。
- 敏感信息加解密。
- ⽤户认证。
- 权限控制。
- 跨站点请求伪造保护。
- 跨域⽀持。
- 全局安全⽅法。
- 单点登录。
搭建Spring Security应用
在idea中构建一个Spring Security的应用,选择Spring Web和Spring Security来让idea自动引入对应的maven坐标。
应用构建完成后,自行创建一个控制器类,用户测试访问:
package com.example.springsecurity.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SampleController {
@GetMapping("/hello")
public String hello() {
return "Hello World";
}
}
设置应用启动的端口
启动应用,控制台会输出一串密码:
浏览器访问新建的控制器,会自动跳转到登录页面,用户名:user,密码是控制台输出的字符串。
登录成功后,就可以看到控制器返回的信息。
如果没有使用Spring Security框架,就不会弹出登录页面,而是直接返回结果。
两种认证模式
在日常开发中,一般不会这么使用,常见的使用方法包括两种形式:表单认证、基础认证
表单认证
表单认证是默认的认证模式。
表单认证⽤于减轻每个请求都必须重新认证的压⼒。⼤多数基于表单的身份认证实现使⽤标准HTML表单字段通过POST请求将⽤户名和密码值传递给服务器。
服务器验证所提供的凭据,并创建⼀个Session会话(有状态),该会话绑定到存储在cookie中的SessionId,并在每个http请求上在客户端和服务器之间传递。如果cookie⽆效或⽤户注销,则服务器通常会重定向到登录页面。
用户登录完成,服务器会生成sessionID,sessionID会自动返回给浏览器并放在cookie中,后面发送的请求,都会带上sessionID,服务器端根据sessionID进行认证。
基础认证
在代码中新增SecurityConfiguration类,完成基础认证操作。
package com.example.springsecurity;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated() //任何请求都要认证
)
.httpBasic(withDefaults());//开启基础认证模式
return http.build();
}
}
启动应用
用户名:user,密码是控制台中输入的字符串。
登录完成,返回了接口信息。
浏览器控制台,可以看到 authorization:Basic dXNlcjphYWEwZjcwNy0wNGViLTQ3YjUtODAxZi0xZmM4NmVmMjAzYjg=,这就是基础认证的信息,Basic表示基础认证,后面的字符串是用户名和密码通过base64编码后的信息。
小技巧:除了使用浏览器访问接口,还可以直接在idea使用idea内置的http客户端,来调用接口,这种方式一般用于接口的测试。操作方法如下:
在控制器方法上,点击圆形的地球图标
idea会自动生成这个文件
直接点击绿色的执行图标,控制台会输出401,代表没有认证通过。
此时,添加认证信息:
authorization:Basic dXNlcjphYWEwZjcwNy0wNGViLTQ3YjUtODAxZi0xZmM4NmVmMjAzYjg=
两种认证模式的区别
表单认证速度更快,效率更高,因为只在第一次请求时根据用户名和密码进行验证,第一次验证通过,服务器端会生成sessionID,sessionID会保存到浏览器的cookie,后续的请求会从cookie中取出sessionID,将sessionID发送给服务器,服务器拿到sessionID后判断sessionID是否存在,存在即有效请求。
基础认证模式,在服务器端不保留信息,不使用cookie,没有会话或注销用户的概念,每个请求都必须携带Request Header才能进行身份验证。
两种认证模式的应用场景
基础认证:对外api接口
表单认证:企业网站