初识 Spring Security
一、认证&授权的概念
1、什么是认证
- 来回答“
我是谁
的问题” - 简单可认为:拥有账号和密码的用户
2、什么是授权
- 来回答“
我能做什么
的问题” - 简单理解为:这个用户能有什么权限
3、SpringSecurity的Helloworld
- 控制器
@RestController
@RequestMapping("/api")
public class UserResource {
@GetMapping("/greeting")
public String greeting(){
return "hello,world";
}
}
- 效果
- 引入SpringSecurity
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 再次访问,自动跳转到自带登录页面,需要做登录认证
- 输入默认配置的密码后,又可访问
- 配置springsecurity配置类
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests(req->req.mvcMatchers("/api/greeting").hasRole("ADMIN"));
}
}
- 再次访问,出现
403错误
,即权限不够
错误,401为没有登录错误
二、过滤器和过滤器链
- 任何SpringWeb应用本质只是一个servlet
- securityFilter在HTTP请求达到你的controller之前过滤每一个传入的HTTP请求
1、过滤器实例流程
2、FilterChain
由多过滤器进行过滤
3、常见的内建过滤器
三、HTTP请求结构
1、HTTP请求基本结构
- 请求头
- 请求体
- 请求方式
- 等…
2、模拟HTTP请求插件【Vscode】
- 模拟HTTP请求
- 模拟实例,也请求上面我们写的controller,出现了一样的
401,未认证错误
- 怎么才能让他有认证,访问成功呢?
- 这次改变模拟的请求方式为
POST
@PostMapping("/greeting")
public String makeGreeting(@RequestParam("name")String name){
return "hello,world" + name;
}
- 出现403,查看控制台出现csrf,post请求为防止csrf网络攻击
- 在配置类中将其先禁用csrf
- 再次访问
-
这次传递json对象
-
定义静态类
- 改造controller
- 再次模拟请求
四、HTTP响应和HTTP BasicAuth
1、HTTP响应
- 响应头
- 响应体
- …
2、响应状态码
- 1XX
- 2XX:表示成功
- 3XX:表示重定向
- 4XX:客户端请求结构有误有错误的地方
- 401:用户为认证授权
- 403:用户权限不够
- 404:资源找不到
- 405:请求方式不正确
- 5XX:服务端本身有误
3、HTTP Basic Auth 认证流程
五、SpringSecurity安全配置
- 自己配置一个用户名密码
- configure
- httpsecurity http【经过过滤器链】
用于配置真正路径资源的安全性
- websecurity web 【不经过过滤器链,直接屏蔽】
一般用于静态资源、图片、音频视频等
- httpsecurity http【经过过滤器链】
六、定制登录页面
1、添加依赖
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator-core</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 自定义一个login.html
2、配置类
指定使用我们自定义的login.html
- WebMvcConfig
映射我们自定义html文件和路径相映射
- SecurityConfig
- 再次访问,就会转跳到自定义login页面了
七、csrf, logout 和 rememberMe 的设置
1、CSRF攻击
2、防止CSRF工具的方式
- 在客户端,设置CSRF Token
- 在响应中设置Cookie的SameSite属性
有浏览器兼容性问题
在前后端分离项目中不存在CSRF攻击的问题,因为前后端分离项目不使用session做会话保留时间,而是直接使用token来实现,直接不存在这种问题