【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;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

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

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

解决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…

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

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

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控制器 一、现代计算机…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址。 它是分配给连接到互联网的设备&#xff08;如计算机、服务器、智能手机…

我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时

据央视新闻从中国民航局了解到&#xff0c;2024 年我国全年新增通航企业 145 家、通用机场 26 个&#xff0c;颁发无人驾驶航空器型号合格证 6 个、新增实名登记无人机 110.3 万架&#xff0c;无人机运营单位总数超过 2 万家&#xff0c;累计完成无人机飞行 2666 万小时&#x…

【Linux】正则表达式

正则表达式是一种可供Linux工具过滤文本的自定义模板&#xff0c;Linux工具&#xff08;如sed、gawk&#xff09;会在读取数据时使用正则表达式对数据进行模式匹配。 正则表达式使用元字符来描述数据流中的一个或多个字符。它是由正则表达式引擎实现的。正则表达式引擎是一种底…

数据平台浅理解

定义 数据平台架构是指用于收集、存储、处理和分析数据的一系列组件、技术和流程的整体架构设计。它就像是一个复杂的数据生态系统的蓝图&#xff0c;旨在高效地管理数据从产生源头到产生价值的整个生命周期。 主要层次 数据源层 这是数据的起点&#xff0c;包含各种类型的数据…

Python入门10:高阶函数

一、什么是高阶函数 1.1、高阶函数的概念和作用&#xff1a; 高阶函数是指 接受函数作为参数 或者 返回函数 作为结果的函数。它在函数式编程中是一个重要概念&#xff08;函数式编程&#xff08;Functional Programming &#xff0c; FP &#xff09;是一 种编程范式&#xf…

浅谈云计算12 | KVM虚拟化技术

KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具&#xff08;QEMU、Libvirt等&#xff09; 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…

GO:GO程序如何处理缓存加载和大数据缓存

如果我们会在程序启动时&#xff0c;需要加载所有数据&#xff0c;最简单的方式就是程序启动&#xff0c;通过轮训从数据库拉取所有数据&#xff0c;并写入到本地缓存中。 问题&#xff1a;数据量较大的时候&#xff0c;程序加载慢&#xff0c;启动时间长&#xff0c;遇到问题不…

【优选算法篇】:分而治之--揭秘分治算法的魅力与实战应用

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.什么是分治算法1.分治算法的基本概念2.分治算法的三个步…

OpenAI Whisper:语音识别技术的革新者—深入架构与参数

当下语音识别技术正以前所未有的速度发展&#xff0c;极大地推动了人机交互的便利性和效率。OpenAI的Whisper系统无疑是这一领域的佼佼者&#xff0c;它凭借其卓越的性能、广泛的适用性和创新的技术架构&#xff0c;正在重新定义语音转文本技术的规则。今天我们一起了解一下Whi…