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

文章目录

  • SpringSecurity安全框架
    • 登录校验流程
    • 登录配置示例

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 请求

@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 代码配置在内存中
/*** @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,完成登录认证功能

@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

@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.mzph.cn/pingmian/67251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dockerfile1.0

docker的数据卷 docker file ------------- 自动自定义镜像 docker的数据卷&#xff1a; 容器与宿主机之间&#xff0c;或者容器和容器之间的数据共享&#xff08;目录&#xff09; 创建容器的时候&#xff0c;通过指定目录&#xff0c;实现容器于宿主机之间&#xff0c;或…

晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

PythonQT5打包exe线程使用

打包&#xff1a; pyinstaller --noconsole --onefile test.py–noconsole 表示不需要打开命令行 修改&#xff1a;test.spec 一般项目里面需要用的资源文件&#xff0c;比如lib、png、exe等。 需要单独修改spec文件 pathex[.],binaries[(D:/test.png, .),(D:/simsun.ttc, .…

List 接口的实现类

在 Java 中&#xff0c;List 是一个非常常用的接口&#xff0c;提供了有序、可重复的元素集合。List 接口有多个实现类&#xff0c;每个实现类都有其特定的特性和适用场景。以下是 Java 中主要实现了 List 接口的类及其详细介绍。 1. 常见的 List 实现类 1.1 ArrayList 简介&…

信号与系统初识---信号的分类

文章目录 0.引言1.介绍2.信号的分类3.关于周期大小的求解4.实信号和复信号5.奇信号和偶信号6.能量信号和功率信号 0.引言 学习这个自动控制原理一段时间了&#xff0c;但是只写了一篇博客&#xff0c;其实主要是因为最近在打这个华数杯&#xff0c;其次是因为在补这个数学知识…

Qt之http客户端类

一、HTTP客户端类功能&#xff1a; 1、POST请求发送&#xff1a; 支持发送JSON格式的数据自动处理请求头设置提供上传进度监控、 2、GET请求发送&#xff1a; 简单的GET请求实现支持下载进度监控 3、状态监控&#xff1a; 通过信号槽机制监控上传/下载进度错误处理和状态回调 /…

解决winodws server iis 下的php mkdir(): Permission denied 问题

这个问题报错原因是权限不够&#xff0c;解决办法如下&#xff1a; 1.在php安装目录下&#xff0c;打开配置文件php.ini 把upload_tmp_dir 前面的分号去掉。 2.给上传的文件夹添加权限 在网站的相应目录&#xff0c;比如目录为tmp&#xff0c;添加IUSR用户&#xff0c;并给所…

如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)

如何在本地部署大模型并实现接口访问&#xff08; Llama3、Qwen、DeepSeek等&#xff09; 如何在本地部署大模型并实现接口访问&#xff08; Llama3、Qwen、DeepSeek等&#xff09;模型地址模型下载模型部署指定显卡运行app.py 运行环境requirements 调用接口代码调用 结语 如何…

数据库增量备份和全量备份

数据库增量备份和全量备份 1.修改配置 首先打开配置文件my.ini 添加以下配置 #log-bin"JSSM-20230617FY-bin" log-bin"mysql-bin"# Server Id. server-id1#指令指定写入二进制日志的事件格式 binlog_formatMIXED添加完之后对MySQL服务进行重启 重启之后…

用 Python 从零开始创建神经网络(十九):真实数据集

真实数据集 引言数据准备数据加载数据预处理数据洗牌批次&#xff08;Batches&#xff09;训练&#xff08;Training&#xff09;到目前为止的全部代码&#xff1a; 引言 在实践中&#xff0c;深度学习通常涉及庞大的数据集&#xff08;通常以TB甚至更多为单位&#xff09;&am…

[250110] React 19 深度探索:新特性、改进与最佳实践 | Caddy 2.9.0 发布

目录 React 19 深度探索&#xff1a;新特性、改进与最佳实践1 Actions API - 简化异步 UI 状态管理2 全新 Hooks 增强灵活性3 服务器组件 - 增强性能4 改进的 hydration5 增强的 Context API6 支持自定义元素7 迁移和最佳实践 Caddy 2.9.0 发布 React 19 深度探索&#xff1a;新…

Git 的基本概念

Git 是一种分布式版本控制系统&#xff0c;用于跟踪文件的修改历史和协同多人开发。 Git 的基本概念包括&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;存储项目文件的地方。分支&#xff08;Branch&#xff09;&#xff1a;用于同时进行多个任务或开发多…

使用 Debug 类的 Assert 方法查找 C# 中的错误

Debug类提供了几种用于调试代码的方法。其Assert方法采用布尔值&#xff0c;如果值为false则抛出异常。第二个参数给出异常应显示的错误消息。如果在调试器中运行时断言失败&#xff0c;您可以选择打开调试器到抛出异常的 Debug.Assert语句。 通常&#xff0c;您使用Debug.Ass…

Ubuntu服务器提示:检测到存在恶意文件,补救思路

1. 确定文件类型 可以使用file命令来检查该文件的类型&#xff0c;这有助于判断它是否真的是一个恶意文件 file /path/to/the/file 2. 检查文件内容 使用strings命令查看文件内容&#xff0c;看是否有可疑的命令或脚本&#xff1a; strings /path/to/the/file 3. 扫描系统…

webrtc自适应分辨率的设置

DegradationPreference 是一个枚举类&#xff0c;用于在视频编码或实时通信&#xff08;如 WebRTC&#xff09;中指定系统资源不足时如何处理质量下降的策略。以下是该枚举类的中文解释&#xff1a; enum class DegradationPreference {// 禁用&#xff1a;不根据资源过载信号…

United States of America三种表示

"United States of America", "United States", 和 "America" 都表示美国&#xff0c;但它们的使用场景和背景略有不同。以下是关于为什么这些名称可以合在一起表示美国的详细解释&#xff1a; 1. "United States of America" 全称&a…

时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级

近日&#xff0c;TDengine 3.3.5.0 版本正式发布&#xff0c;带来了多项重磅更新与优化&#xff0c;从功能拓展到性能提升&#xff0c;再到用户体验进行了全面改进。本次更新围绕用户核心需求展开&#xff0c;涵盖了开发工具、数据管理、安全性、可视化等多个层面&#xff0c;为…

Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt绘图基础 QPainter概述 基本工作流程 绘图事件系统 paintEvent事件 重绘机制 文字绘制技术 基本文字绘制 ​编辑 高级文字效果 基本图形绘制 线条绘制 ​编辑 形状绘制 …

《计算机网络》课后探研题书面报告_网际校验和算法

网际校验和算法 摘 要 本文旨在研究和实现网际校验和&#xff08;Internet Checksum&#xff09;算法。通过阅读《RFC 1071》文档理解该算法的工作原理&#xff0c;并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文&#xff08;包括ICMP、TCP、UDP等&a…

浅谈计算机网络02 | SDN控制平面

计算机网络控制平面 一、现代计算机网络控制平面概述1.1 与数据平面、管理平面的关系1.2 控制平面的发展历程 二、控制平面的关键技术剖析2.1 网络层协议2.1.1 OSPF协议2.1.2 BGP协议 2.2 SDN控制平面技术2.2.1 SDN架构与原理2.2.2 OpenFlow协议2.2.3 SDN控制器 一、现代计算机…