【SpringSecurity】SpringSecurity安全框架登录校验流程与登录配置示例

embedded/2025/1/16 10:46:32/

文章目录

SpringSecurity_1">SpringSecurity安全框架

Security 是一个能够为基于 Spring 的应用程序提供认证、授权以及保护免受攻击的安全框架。它是 Spring 生态系统的一部分,与 Spring 框架无缝集成。这些框架帮助开发者实现认证(Authentication)、授权(Authorization)、加密(Encryption)和其他安全相关功能,以保护数据的机密性、完整性和可用性。

  • 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
  • 授权:经过认证后判断当前用户是否有权限进行某个操作

Apache Shiro 是另一个针对 Java 应用的安全框架,提供了简单易用的API来处理认证、授权、加密和会话管理。相较于 SpringSecurity,Shiro 更加轻量级,适用于小型到中型应用程序,但提供的安全特性没有那么深入或复杂。适用于不需要与 Spring 框架集成的应用程序,或者对安全框架的轻量级有要求的场景。(不推荐使用)

在 SpringBoot 项目中引入 SpringSecurity 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

随意编写一个 controller 请求

java">@RestController
@RequestMapping("/index")
public class IndexController {@RequestMapping("/info")public String info(){return "index";}
}

当尝试访问接口就会自动跳转到一个 SpringSecurity 的默认登陆页面,默认用户名是 user,密码会输出在控制台。必须登陆之后才能对接口进行访问。若用户名或密码错误则无法成功访问。

在这里插入图片描述

登录校验流程

在这里插入图片描述

1、前端发起请求调用登录接口,携带用户名、密码

2、和数据库用户名、密码进行校验

3、校验成功则使用用户 ID 生成唯一令牌 token(JWT加密),存入 redis

4、将 token 响应给前端,由前端存储

5、登录后访问其他请求,在请求头中携带 token

6、解析 token(JWT解密),获取用户 ID,根据 ID 获得 redis 中的存储对象,查询权限是否可以访问

7、响应前端数据

SpringSecurity 的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。

在这里插入图片描述

图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示。

UsernamePasswordAuthenticationFilter:负责处理基于表单的登录请求。当用户提交了用户名和密码后,会捕获这个请求,并尝试进行认证。

ExceptionTranslationFilter:处理在认证或授权过程中抛出的异常。

FilterSecurityInterceptor:是过滤器链中负责实际执行授权决策的过滤器。它会检查当前用户是否有权限访问所请求的资源。

可以通过 Debug 查看当前系统中 SpringSecurity 过滤器链中有哪些过滤器及它们的顺序。

在这里插入图片描述

登录配置示例

随机生成的密码每次启动时都会变。若对登录的用户名/密码进行配置,有三种不同的方式:

  1. 在 application.yml 中进行配置(自动加密)
spring:security:user:name: userpassword: 123
  1. 通过 Java 代码配置在内存中
java">/*** @Description: security 配置类*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {public void configure(AuthenticationManagerBuilder auth) throws Exception {// 初始化账号密码auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("user").password(passwordEncoder().encode("123")) // 密码加密.roles("USER"); // 权限配置}@BeanPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}
  1. 通过 Java 从数据库中加载

创建数据库表以及实体类;数据库连接、mybatis-plus 的依赖引入;yml 相关配置;dao 层构建

创建 LoginAuthenticationProvider 类,实现接口 AuthenticationProvider,完成登录认证功能

java">@Component
public class LoginAuthenticationProvider implements AuthenticationProvider {@Resourceprivate UserDao userDao;@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {// 认证逻辑// 获取页面中的账号密码String userName = (String) authentication.getPrincipal();String password = (String) authentication.getCredentials();// 调用数据库进行校验User user = userDao.selectOne(new QueryWrapper<User>().eq("userCode",userName).eq("userPassword",password));// 认证登录状态if (user != null) {return new UsernamePasswordAuthenticationToken(user, password, AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER"));}return null;}/*** 判断是否支持 如果该 AuthenticationProvider 支持传入的 Authentication 对象,则返回 true* @param authentication 认证* @return*/@Overridepublic boolean supports(Class<?> authentication) {return authentication.equals(UsernamePasswordAuthenticationToken.class);}
}

修改 security 配置类 SecurityConfig

java">@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {// 实例化过滤器@Resourceprivate LoginAuthenticationProvider loginAuthenticationProvider;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {// 替换认证的过滤器auth.authenticationProvider(loginAuthenticationProvider);}@Overridepublic void configure(HttpSecurity http) throws Exception {// 关闭csrf防护http.csrf().disable().headers().frameOptions().disable().and();// 登录处理http.formLogin() //表单方式,或httpBasic.loginPage("/login.html") //自定义登录页面.loginProcessingUrl("/form") //表单提交路径.defaultSuccessUrl("/index/info") //成功登陆后跳转页面.usernameParameter("userCode").passwordParameter("password").permitAll(); //允许所有用户访问// 权限配置 授权http.authorizeRequests().antMatchers("/").permitAll() //允许所有用户访问.antMatchers("/index/**").hasAnyRole("ADMIN", "USER") //index下的页面ADMIN USER两角色都可以访问.antMatchers("/user/**").hasRole("USER").antMatchers("/admin/**").hasRole("ADMIN");}
}

编写页面和 Controller 进行测试

CSRF

跨站请求伪造(Cross-site request forgery)是一种对网站的恶意利用,也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。 CSRF 跨站点请求伪造跟 XSS 跨网站脚本攻击一样存在巨大的危害性。

跟 XSS 相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

在这里插入图片描述

CSRF攻击攻击原理及过程如下

  1. 用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
  2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
  3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

所以要被CSRF攻击,必须同时满足两个条件:

  1. 登录受信任网站A,并在本地生成Cookie。
  2. 在不登出A的情况下,访问危险网站B。

SpringSecurity 防止 CSRF 攻击的方式是通过 csrf_token。后端会生成一个 csrf_token,前端发起请求的时候需要携带这个 csrf_token,后端会有过滤器进行校验,如果没有携带或者是伪造的就不允许访问。

CSRF 攻击依靠的是 cookie 中所携带的认证信息。但是在前后端分离的项目中我们的认证信息其实是 token,而 token 并不是存储中 cookie 中,并且需要前端代码去把 token 设置到请求头中才可以,所以 CSRF 攻击也就不用担心了。


http://www.ppmy.cn/embedded/154376.html

相关文章

【ArcGIS技巧】如何给CAD里的面注记导入GIS属性表中

前面分享了GIS怎么给田块加密高程点&#xff0c;但是没有分享每块田的高程对应的是哪块田&#xff0c;今天结合土地整理软件GLAND做一期田块的属性怎么放入GIS属性表当中。 1、GLAND数据 杭州阵列软件&#xff08;GLand&#xff09;是比较专业的土地整理软件&#xff0c;下载之…

[PAT 甲级] 1179 Chemical Equation (DFS)

​ 题目翻译&#xff08;GPT&#xff09;&#xff1a; 1179 化学方程式 化学方程式是一种用符号和公式表示化学反应的方法&#xff0c;其中反应物在方程式的左侧&#xff0c;生成物在右侧。例如&#xff1a; CH₄ 2O₂ -> CO₂ 2H₂O 表示反应物为甲烷和氧气&#xff…

Oracle 23ai新特性:表值构造函数

随着 Oracle 数据库不断发展&#xff0c;新版本引入了许多增强功能和特性&#xff0c;以提高开发效率、简化 SQL 编写并优化性能。Oracle 23c 引入了表值构造器&#xff08;Table Values Constructor&#xff09;&#xff0c;这一特性允许用户直接在 SQL 语句中定义和使用内联表…

如何使用策略模式并让spring管理

1、策略模式公共接口类 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式业务实现类 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…

zookeeper 基本原理-单机模式、集群模式

单机模式 单机安装非常简单&#xff0c;只要获取到 Zookeeper 的压缩包并解压到某个目录如&#xff1a;C:\zookeeper-3.4.5\下&#xff0c;Zookeeper 的启动脚本在 bin 目录下&#xff0c;Windows 下的启动脚本是 zkServer.cmd。 在你执行启动脚本之前&#xff0c;还有几个基本…

自动生成数据:SQLark 让数据测试更高效

在新版本的业务系统开发过程中&#xff0c;需要生成大量的测试数据来模拟真实的业务场景&#xff0c;测试系统的稳定性和性能。今天分享一下我使用SQLark生成测试数据的经验&#xff0c;它能够提供8大类47个子类的数据规则&#xff0c;快速构建仿真测试数据环境&#xff0c;还支…

SQL 快速参考

SQL 快速参考 介绍 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系数据库管理系统的标准编程语言。它用于执行各种操作&#xff0c;如查询、更新、插入和删除数据库中的数据。本快速参考指南提供了SQL的基本语法和常用命…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO&#xff08;El Nio-Southern Oscillation&#xff09;是全球气候系统中最显著的年际变率现象之一&#xff0c;对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来&#xff0c;深度学习技术在气象领域…