01Spring Security框架

发布于:2025-03-17 ⋅ 阅读:(16) ⋅ 点赞:(0)

Spring Security是什么?

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

Spring Security做什么?

作为开发⼈员,在⽇常开发过程中需要⽤到Spring Security的场景⾮常多。事实上,对Web应⽤程序⽽⾔,除了分布式环境下的认证和授权漏洞,常⻅的安全性问题还包括跨站点脚本攻击、跨站点请求伪造、敏感数据暴露、缺乏⽅法级访问控制等。针对这些安全性问题,开 发⼈员都需要全⾯设计并实现对应的安全性功能,⽽Spring Security已经为开发⼈员提供了相应的解决⽅案,主要包括如下内容:
  1. ⽤户信息管理。
  2. 敏感信息加解密。
  3. ⽤户认证。
  4. 权限控制。
  5. 跨站点请求伪造保护。
  6. 跨域⽀持。
  7. 全局安全⽅法。
  8. 单点登录。

搭建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进行认证。

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

在代码中新增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接口

表单认证:企业网站