目录

01Spring-Security框架

01Spring Security框架

Spring Security是什么?

Spring Security是⼀个提供身份验证、授权和针对常见攻击的保护的框架。

Spring Security做什么?

作为开发⼈员,在⽇常开发过程中需要⽤到Spring Security的场景⾮常多。事实上,对Web应⽤程序⽽⾔,除了分布式环境下的认证和授权漏洞,常⻅的安全性问题还包括跨站点脚本攻击、跨站点请求伪造、敏感数据暴露、缺乏⽅法级访问控制等。针对这些安全性问题,开

发⼈员都需要全⾯设计并实现对应的安全性功能,⽽Spring Security已经为开发⼈员提供了相应的解决⽅案,主要包括如下内容:

  1. ⽤户信息管理。
  2. 敏感信息加解密。
  3. ⽤户认证。
  4. 权限控制。
  5. 跨站点请求伪造保护。
  6. 跨域⽀持。
  7. 全局安全⽅法。
  8. 单点登录。

搭建Spring Security应用

https://i-blog.csdnimg.cn/direct/ee4afd734293448b99db748b52cb8bab.png

https://i-blog.csdnimg.cn/direct/8166dd83d82c4dd58dd95f9225afe0da.png

https://i-blog.csdnimg.cn/direct/fc73b3667bea464f8c5d71497e0cff1b.png

https://i-blog.csdnimg.cn/direct/ff0f9dea2104451baf64eb75a51575e8.png

在idea中构建一个Spring Security的应用,选择Spring Web和Spring Security来让idea自动引入对应的maven坐标。

应用构建完成后,自行创建一个控制器类,用户测试访问:

https://i-blog.csdnimg.cn/direct/b1dc9f9b59294d1ea508655f0ee44548.png

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";
    }
}

设置应用启动的端口

https://i-blog.csdnimg.cn/direct/9aa8e30492734cfbba6cdb47e8cd4e42.png

启动应用,控制台会输出一串密码:

https://i-blog.csdnimg.cn/direct/002d5c5169c049059587fe66cf6d2ec3.png

浏览器访问新建的控制器,会自动跳转到登录页面,用户名:user,密码是控制台输出的字符串。

https://i-blog.csdnimg.cn/direct/91b9cba2bcce43aea31167ab7096ec1d.png

登录成功后,就可以看到控制器返回的信息。

https://i-blog.csdnimg.cn/direct/190a81163f8e406b9af1ebda242ea870.png

如果没有使用Spring Security框架,就不会弹出登录页面,而是直接返回结果。

两种认证模式

在日常开发中,一般不会这么使用,常见的使用方法包括两种形式:表单认证、基础认证

表单认证

表单认证是默认的认证模式。

表单认证⽤于减轻每个请求都必须重新认证的压⼒。⼤多数基于表单的身份认证实现使⽤标准HTML表单字段通过POST请求将⽤户名和密码值传递给服务器。

服务器验证所提供的凭据,并创建⼀个Session会话(有状态),该会话绑定到存储在cookie中的SessionId,并在每个http请求上在客户端和服务器之间传递。如果cookie⽆效或⽤户注销,则服务器通常会重定向到登录页面。

https://i-blog.csdnimg.cn/direct/f687802258df40fe88584b39ffb00af8.png

用户登录完成,服务器会生成sessionID,sessionID会自动返回给浏览器并放在cookie中,后面发送的请求,都会带上sessionID,服务器端根据sessionID进行认证。

https://i-blog.csdnimg.cn/direct/67bd05015fd245fdab5b343a691f88cc.png

基础认证

HTTP基础认证的原理⽐较简单,只是通过HTTP的消息头携带⽤户名和密码进⾏登录验证。

在代码中新增SecurityConfiguration类,完成基础认证操作。

https://i-blog.csdnimg.cn/direct/69435dd9d6a74d509fe806442ef7f8e0.png

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();
    }
}

启动应用

https://i-blog.csdnimg.cn/direct/5e1f02937a55407e8a95187e98a5dfad.png

用户名:user,密码是控制台中输入的字符串。

登录完成,返回了接口信息。

https://i-blog.csdnimg.cn/direct/ece0cb8bb4d2449c9848beb2f1a6f0c5.png

浏览器控制台,可以看到 authorization:Basic dXNlcjphYWEwZjcwNy0wNGViLTQ3YjUtODAxZi0xZmM4NmVmMjAzYjg=,这就是基础认证的信息,Basic表示基础认证,后面的字符串是用户名和密码通过base64编码后的信息。

https://i-blog.csdnimg.cn/direct/8a4825e2197a419eadbb5a5de1ed8e83.png

小技巧: 除了使用浏览器访问接口,还可以直接在idea使用idea内置的http客户端,来调用接口,这种方式一般用于接口的测试。操作方法如下:

在控制器方法上,点击圆形的地球图标

https://i-blog.csdnimg.cn/direct/0e3d4c0aeb4348a38654970bd5edd3d9.png

https://i-blog.csdnimg.cn/direct/ecae95431e4547dfba571d1c50999441.png

idea会自动生成这个文件

https://i-blog.csdnimg.cn/direct/ff3be18b1e42447aa22a8951c19009fa.png

直接点击绿色的执行图标,控制台会输出401,代表没有认证通过。

https://i-blog.csdnimg.cn/direct/f9d94faeff9f4188b9fcb0a5749af658.png

此时,添加认证信息:

authorization:Basic dXNlcjphYWEwZjcwNy0wNGViLTQ3YjUtODAxZi0xZmM4NmVmMjAzYjg=

https://i-blog.csdnimg.cn/direct/bd61eb7a41c444118d4dfa9166f95ae4.png

两种认证模式的区别

表单认证速度更快,效率更高,因为只在第一次请求时根据用户名和密码进行验证,第一次验证通过,服务器端会生成sessionID,sessionID会保存到浏览器的cookie,后续的请求会从cookie中取出sessionID,将sessionID发送给服务器,服务器拿到sessionID后判断sessionID是否存在,存在即有效请求。

基础认证模式,在服务器端不保留信息,不使用cookie,没有会话或注销用户的概念,每个请求都必须携带Request Header才能进行身份验证。

两种认证模式的应用场景

基础认证: 对外api接口

https://i-blog.csdnimg.cn/direct/47621ba04a054992bebba8ba24b60614.png

表单认证:企业网站

https://i-blog.csdnimg.cn/direct/d9b7a2ec8edc4046a6c2490ad4aebfb7.png