Day237.初识 Spring Security -SpringSecurity&OAuth2

初识 Spring Security

一、认证&授权的概念

1、什么是认证

  • 来回答“我是谁的问题”
  • 简单可认为:拥有账号和密码的用户

Day237.初识 Spring Security   -SpringSecurity&OAuth2


2、什么是授权

  • 来回答“我能做什么的问题”
  • 简单理解为:这个用户能有什么权限

Day237.初识 Spring Security   -SpringSecurity&OAuth2


3、SpringSecurity的Helloworld

  • 控制器
@RestController
@RequestMapping("/api")
public class UserResource {
    @GetMapping("/greeting")
    public String greeting(){
        return "hello,world";
    }
}
  • 效果

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 引入SpringSecurity
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  • 再次访问,自动跳转到自带登录页面,需要做登录认证

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 输入默认配置的密码后,又可访问

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 配置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为没有登录错误

Day237.初识 Spring Security   -SpringSecurity&OAuth2


二、过滤器和过滤器链

  • 任何SpringWeb应用本质只是一个servlet
  • securityFilter在HTTP请求达到你的controller之前过滤每一个传入的HTTP请求

Day237.初识 Spring Security   -SpringSecurity&OAuth2

1、过滤器实例流程

Day237.初识 Spring Security   -SpringSecurity&OAuth2

2、FilterChain

由多过滤器进行过滤

Day237.初识 Spring Security   -SpringSecurity&OAuth2

3、常见的内建过滤器

Day237.初识 Spring Security   -SpringSecurity&OAuth2


三、HTTP请求结构

1、HTTP请求基本结构

  • 请求头
  • 请求体
  • 请求方式
  • 等…

Day237.初识 Spring Security   -SpringSecurity&OAuth2


2、模拟HTTP请求插件【Vscode】

  • 模拟HTTP请求

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 模拟实例,也请求上面我们写的controller,出现了一样的401,未认证错误

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 怎么才能让他有认证,访问成功呢?

Day237.初识 Spring Security   -SpringSecurity&OAuth2


  • 这次改变模拟的请求方式为POST
@PostMapping("/greeting")
public String makeGreeting(@RequestParam("name")String name){
    return "hello,world" + name;
}

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 出现403,查看控制台出现csrf,post请求为防止csrf网络攻击

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 在配置类中将其先禁用csrf

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 再次访问

Day237.初识 Spring Security   -SpringSecurity&OAuth2


  • 这次传递json对象

  • 定义静态类

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 改造controller

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 再次模拟请求

Day237.初识 Spring Security   -SpringSecurity&OAuth2


四、HTTP响应和HTTP BasicAuth

1、HTTP响应

  • 响应头
  • 响应体

Day237.初识 Spring Security   -SpringSecurity&OAuth2


2、响应状态码

  • 1XX
  • 2XX:表示成功
  • 3XX:表示重定向
  • 4XX:客户端请求结构有误有错误的地方
    • 401:用户为认证授权
    • 403:用户权限不够
    • 404:资源找不到
    • 405:请求方式不正确
  • 5XX:服务端本身有误

Day237.初识 Spring Security   -SpringSecurity&OAuth2


3、HTTP Basic Auth 认证流程

Day237.初识 Spring Security   -SpringSecurity&OAuth2


五、SpringSecurity安全配置

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 自己配置一个用户名密码

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • configure
    • httpsecurity http【经过过滤器链】用于配置真正路径资源的安全性
    • websecurity web 【不经过过滤器链,直接屏蔽】一般用于静态资源、图片、音频视频等

Day237.初识 Spring Security   -SpringSecurity&OAuth2


六、定制登录页面

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

Day237.初识 Spring Security   -SpringSecurity&OAuth2

2、配置类

指定使用我们自定义的login.html

  • WebMvcConfig

映射我们自定义html文件和路径相映射

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • SecurityConfig

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 再次访问,就会转跳到自定义login页面了

七、csrf, logout 和 rememberMe 的设置

1、CSRF攻击

Day237.初识 Spring Security   -SpringSecurity&OAuth2

2、防止CSRF工具的方式

  • 在客户端,设置CSRF Token

Day237.初识 Spring Security   -SpringSecurity&OAuth2

  • 在响应中设置Cookie的SameSite属性

有浏览器兼容性问题

Day237.初识 Spring Security   -SpringSecurity&OAuth2

在前后端分离项目中不存在CSRF攻击的问题,因为前后端分离项目不使用session做会话保留时间,而是直接使用token来实现,直接不存在这种问题


3、Remember-me 功能

Day237.初识 Spring Security   -SpringSecurity&OAuth2


上一篇:CSRF和XSS


下一篇:CSRF(跨站请求伪造攻击)