SpringSecurity框架(入门)

  1. 简介:

Spring Security 是一个用于构建安全的 Java 应用程序的框架,尤其适用于基于Spring的应用程序。它提供了全面的安全控制,从认证(Authentication)到授权(Authorization),以及一系列的中间件功能,如CSRF防护、会话管理等。以下是Spring Security的核心概念和使用方式的详细说明:

  1. What: Spring Security 是什么?

Spring Security 是一套用于保护Web应用程序免受未经授权访问的框架。它提供了以下核心功能:

  • 认证:验证用户身份,例如通过用户名和密码登录。

  • 授权:控制对资源的访问,例如,只有管理员才能访问某些页面。

  • 会话管理:确保会话安全,防止会话劫持和固定会话攻击。

  • CSRF防护:防止跨站请求伪造(Cross-Site Request Forgery)。

  • 过滤器链:通过一系列的过滤器来处理HTTP请求,执行安全相关的操作。(我们主要就是写自定义的过滤器)

  1. Why: 为什么使用Spring Security?

  • 声明式安全:通过注解或配置文件轻松声明谁可以访问什么资源,无需手动编写安全检查代码。

  • 高度可定制:可以根据需求调整认证和授权逻辑,支持多种认证和授权机制。

  • 与Spring的集成:无缝集成Spring框架,与Spring Boot、Spring MVC等组件配合良好。

  • 安全功能丰富:提供多种安全特性,覆盖了Web应用安全的多个方面。

  1. How: 如何使用Spring Security?

使用Spring Security通常包括以下步骤:

  • 依赖配置:在项目中引入Spring Security的依赖,如果是Spring Boot项目,可以通过添加相应的starter依赖。

  • 配置安全:创建一个WebSecurityConfigurerAdapter的子类,重写其配置方法来定义安全规则,例如哪些URL需要保护,使用哪种认证方式等。

  1. SpringSecurity认证管理流程

下图是一个简单的Security认证管理流程

  1. 快速入门实践

接下来,我们创建一个小的Module感受下SpringSecurity在登录情景下的使用

  1. 创建Module

  1. 在当前最外层根目录下,右键,选择 "New"-->"Module"--"Spring Initializer"-->选择"设置"->将初始化服务器地址设置为https://start.aliyun.com国内阿里云

  1. 按照下图所示的内容创建 "securityDemo"

  1. 添加六个依赖

  1. 删除原有的demos目录及文件

  1. 如图所示修改application.properties

    # 应用服务 WEB 访问端口
    server.port=8080# 数据库连接信息
    spring.datasource.url=jdbc:mysql://localhost:3306/ivos?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    spring.datasource.username=root
    spring.datasource.password=root
  1. 启动项目,控制台会出现如下图所示的一个密码

 复制这个密码,马上要用

  1. 访问登录页面

SpringSecurity自己提供了一个登录页,我们可以直接通过 http://localhost:8080/login 访问

  • 默认用户名 user

  • 密码为之前控制台输出的password 1854cb7d-e2ef-4d84-a4f7-df2e18855a24

注意:这个密码每个人不一样,而且这个登录页打开比较慢,需要等一下

  1. 认证流程拆分

结合上面的这个登录认证流程,我们来继续补充完善完整的流程,Spring Security 的流程控制涉及了一系列的过滤器,这些过滤器构成了大家俗称的“安全过滤器链”。完整流程是这样的:

  1. 用户尝试访问受Spring Security保护下的URL地址

  2. 访问此URL需要检验有没有认证,Spring Security会检查该请求是否允许放行

  3. 如果不允许放行

    1. 我们指定的过滤器会返回拒绝访问的状态码,一般为401未授权(SC_UNAUTHORIZED)与403拒绝访问(SC_FORBIDDEN)

    2. 如果在没有登录的情况下,所有的前端请求应该都需要接收到后端返回的未授权状态

  4. 如果允许放行

    1. 会根据请求调用对应的接口加载资源

          (比如生成接口文档无需验证都可放行http://localhost:8080/doc.html)

    2. 登录请求也不需要验证即可放行,我们需要在表单中拿到用户的身份信息进行进一步的身份认证

      1. Authentication Manager认证管理器会进行用户信息认证

      2. Authentication Provider 会调用UserDetailsService,将用户名与数据库中的用户信息进行匹配,同时验证密码

      3. 如果验证成功,创建一个Authentication认证对象,包含用户及权限信息

    3. 验证成功后,Spring Security会调用配置的AuthenticationSuccessHandler,将用户信息返回给前端

          我们存在localStorage中的userVO就是通过上面的AuthenticationSuccessHandler返回给前端的

进阶练习,在你的项目中使用Security

新增依赖(在你的pom.xml中添加):

 <!-- Security依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- JSON处理工具类 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.36</version></dependency>
  1. 自定义配置类SpringSecurityConfig

  1. 我们需要在cn.tedu.ivos.base 包下新建一个security 包

  2. 在 security 包下创建一个自定义配置类 SpringSecurityConfig

  1. 这个配置类需要继承WebSecurityConfigurerAdapter

  • SpringSecurity框架提供了WebSecurityConfigurerAdapter安全基类

  • 该类提供了默认的安全配置,当我们的自定义类继承该类时,实际上在创建一个配置Bean

  • 这个Bean会被Spring自动检测到并用来定制我们自己的安全设置

  • 通过继承可以大大简化安全配置,而且重写 configure(HttpSecurity http)方法可以定制化内容

package cn.tedu.ivos.base.security;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;//表示这是一个配置类,交由Spring容器管理
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {}
  1. 设置请求放行的处理方案(登录后端改造)

  1. SpringSecurity基础安全配置1

重写configure(HttpSecurity http)进行配置

这些配置组合起来,创建了一个基础的安全策略,其中大部分资源需要认证,登录页面对所有人开放,且使用HTTP基本认证和自定义的登录成功/失败处理器

package cn.tedu.ivos.base.security;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;//表示这是一个配置类,交由Spring容器管理
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {//super.configure(http);//这个表示调用父类的实现,我们不需要http.csrf().disable() // 禁用CSRF(跨站请求伪造)保护.httpBasic() // 配置HTTP基本认证.and().authorizeRequests() // 配置请求授权,默认禁用所有请求.antMatchers().permitAll() // 对指定的资源不进行权限检查,允许所有用户访问.anyRequest().authenticated() //对其他所有请求要求用户必须认证通过.and().formLogin() // 配置表单登录,默认拦截的登录请求地址为/login.successHandler(authenticationSuccessHandler) //设置认证成功处理器.failureHandler(authenticationFailureHandler) //设置认证失败处理器.permitAll() //允许所有用户进行登录尝试;}
}
  1. 自定义的认证成功处理器CustomAuthenticationSuccessHandler

当用户成功通过认证后,会调用这个处理器的onAuthenticationSuccess方法

package cn.tedu.ivos.base.security;import cn.tedu.ivos.base.response.JsonResult;
import cn.tedu.ivos.user.mapper.UserMapper;
import cn.tedu.ivos.user.pojo.vo.UserVO;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Service;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/** 自定义的认证成功处理器* 当用户成功通过认证后,会调用这个处理器的onAuthenticationSuccess方法* */
@Slf4j
@Service
public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {@AutowiredUserMapper userMapper;@Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {//可以根据我们的业务需要编写认证成功后的逻辑log.debug("认证成功");//从认证信息中获取用户名信息String username = authentication.getName();//根据用户名查询用户信息UserVO userVO = userMapper.selectByUsername(username);//设置响应的字符编码和内容类型,确保前端能正确解析JSON格式的数据response.setCharacterEncoding("UTF-8");response.setContentType("application/json;charset=UTF-8");//将查询到的用户信息封装成JSON格式,写入响应中返回给前端response.getWriter().write(JSON.toJSONString(JsonResult.ok(userVO)));}
}
  1. 自定义的认证失败处理器CustomAuthenticationFailureHandler

 当用户认证失败后,会调用这个处理器的onAuthenticationFailure方法

package cn.tedu.ivos.base.security;import cn.tedu.ivos.base.response.JsonResult;
import cn.tedu.ivos.base.response.StatusCode;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Service;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/** 自定义的认证失败处理器* 当用户认证失败后,会调用这个处理器的onAuthenticationFailure方法* */
@Slf4j
@Service
public class CustomAuthenticationFailureHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {//可以根据我们的业务需要编写认证失败后的逻辑log.debug("认证失败");//设置响应的字符编码为UTF-8,确保传输的数据在客户端能够正确解析response.setCharacterEncoding("UTF-8");//设置响应的内容类型为application/json,指定客户端应以JSON格式解析响应数据//同时指定字符集为UTF-8,与前面的设置保持一致response.setContentType("application/json;charset=UTF-8");//将用户名错误的响应结果转换为JSON格式,并写入响应流//JsonResult封装了状态码和可能的错误信息,这里使用StatusCode.USERNAME_ERROR表示用户名错误的特定状态码response.getWriter().write(JSON.toJSONString(new JsonResult(StatusCode.USERNAME_ERROR)));}
}
  1. SpringSecurity基础安全配置2

重写configure(AuthenticationManagerBuilder auth) 方法

package cn.tedu.ivos.base.security;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;//表示这是一个配置类,交由Spring容器管理
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@AutowiredCustomAuthenticationSuccessHandler authenticationSuccessHandler;@AutowiredCustomAuthenticationFailureHandler authenticationFailureHandler;@AutowiredCustomAuthenticationProvider authenticationProvider;@Overrideprotected void configure(HttpSecurity http) throws Exception {//super.configure(http);//这个表示调用父类的实现,我们不需要http.csrf().disable() // 禁用CSRF(跨站请求伪造)保护.httpBasic() // 配置HTTP基本认证.and().authorizeRequests() // 配置请求授权,默认禁用所有请求.antMatchers().permitAll() // 对指定的资源不进行权限检查,允许所有用户访问.anyRequest().authenticated() //对其他所有请求要求用户必须认证通过.and().formLogin() // 配置表单登录,默认拦截的登录请求地址为/login.successHandler(authenticationSuccessHandler) //设置认证成功处理器.failureHandler(authenticationFailureHandler) //设置认证失败处理器.permitAll() //允许所有用户进行登录尝试;}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//super.configure(auth);auth.authenticationProvider(authenticationProvider);}
}

后续稍后更新.... 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461295.html

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

相关文章

广东网站设计提升你网站在搜索引擎中的排名

在当今网络盛行的时代&#xff0c;拥有一个设计优良的网站&#xff0c;对企业的在线发展至关重要。特别是对于广东地区的企业来说&#xff0c;网站设计不仅仅是美观的问题&#xff0c;更直接影响着搜索引擎中的排名。因此&#xff0c;精心策划和设计的网站&#xff0c;能够显著…

Cuebric:用AI重新定义3D创作的未来

一、简介 Cuebric 是一家成立于2022年夏天的好莱坞创新公司,致力于为电影、电视、游戏和时尚等行业提供先进的AI多模态SaaS平台。自2024年1月正式推出以来,Cuebric 已经在市场上获得了广泛的认可和积极的反馈。目前,该平台正处于1.0版本的beta测试阶段,已募集约50万美元的…

计算机的错误计算(一百四十)

摘要 探讨 MATLAB 中函数 的计算精度。 从计算机的错误计算&#xff08;一百三十九&#xff09;知&#xff0c;对于对数运算&#xff0c;当真数在 1 附近时&#xff0c;计算机的输出会出现较大误差。为此&#xff0c;IEEE 754-2019 中专门定义有函数 其目的就是当自变量在 …

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作&#xff1a;点击按键和释放按键&#xff0c;也就是按键按下和松开。按键按下的对应的事件是KEYDOWN&#xff0c;按键松开对应…

《高频电子线路》 —— 高频谐振功放(2)

动态特性与负载特性 动态特性 静态特性是指&#xff0c;不考虑负载阻抗的时候获得的&#xff0c;即转移特性曲线和输出特性曲线。 考虑负载时&#xff0c;电流变化的时候&#xff0c;负载上的电压就会变化&#xff0c;管子上面的Vce也会变化。 考虑负载的反作用后&#xff0c…

SpringBoot 下的Excel文件损坏与内容乱码问题

序言 随着打包部署的方式的改变&#xff0c;原本正常运行的代码可能带来一些新的问题&#xff0c;比如我们现在使用SpringBoot 的方式生成Jar包直接运行&#xff0c;就会对我们再在Resource下的Excel文件产生影响&#xff0c;导入与预期不符的情况发生cuiyaonan2000163.com 比…

「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用

在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。 关键词 Image 组件图片加载本地资源远程图片图片轮播一、Image 组件基础…

上海亚商投顾:沪指缩量调整 华为概念股午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整&#xff0c;沪指、深成指午后跌超1%&#xff0c;创业板指一度跌逾2%&#xff0c;尾盘跌幅有…

vim命令及shell命令

目录 vim命令 vim三种工作模式 光标的跳转 复制粘贴 剪切删除 撤销回滚替换 翻页 其他 shell编程命令 判断用户的参数 可用的整数比较运算符 常见的字符串比较运算符 if条件测试语句 for条件循环语句 vim命令 vim三种工作模式 Vim编辑器中设置了三种模式: 命令…

Z 检验和 T 检验之间的区别

目录 一、说明 二、什么是假设检验&#xff1f; 三、假设检验基础 3.1 假设检验的基本概念 3.2 、执行假设验证的步骤 3.3 临界值、P 值 3.4 方向假设 3.5 非方向假设检验s 四、什么是 Z 检验统计量&#xff1f; 五、Z 检验示例 5.1 单样本 Z 检验 5.2 双样本 Z 检…

Qt限制QGraphicsScene QGraphicsItem内部的移动范围

用过QGraphicsView的都知道&#xff0c;原点一般设定在view和item的中心&#xff0c;所以帮助文档和这个网友说的不一定跟我们对的上&#xff1a; 关于Qt限制QGraphicsScene内部Item的移动范围_qgraphicsitem限制移动范围-CSDN博客 首先&#xff0c;设定view的scenerect&…

【Redis】浅析Redis大Key

目录 1、什么是Redis大Key 2、大 Key 是怎么产生的 3、大 Key 导致的问题 4、如何快速找到 Redis 大 Key 5、大 Key 优化策略 6、总结 我们在使用 Redis 的过程中&#xff0c;如果未能及时发现并处理 Big keys&#xff08;下文称为“大Key”&#xff09;&#xff0c;可能…

Jedis操作和springboot整合redis

Jedis-springboot整合redis Jedis 引入jedis依赖 注意事项 测试相关数据类型 Key String List set hash zset 案例 spring boot整合redis 引入相关依赖 在application.properties中配置redis 配置 创建redis配置类 创建测试类 Jedis 引入jedis依赖 <depen…

GenAI 生态系统现状:不止大语言模型和向量数据库

自 20 个月前 ChatGPT 革命性的推出以来&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;领域经历了显著的发展和创新。最初&#xff0c;大语言模型&#xff08;LLMs&#xff09;和向量数据库吸引了最多的关注。然而&#xff0c;GenAI 生态系统远不止这两个部分&#…

HTML、JavaScript和CSS实现注册页面设计

目录 一、实现要求 二、实现页面图 1、注册页面 2.用户ID、用户名、口令验证成功后显示页面 三、用户ID、用户名、口令、确定口令验证逻辑js代码 1、验证用户ID 2、验证用户名 3、验证口令密码 四、总结 五、代码仓库 一、实现要求 综合使用HTML、JavaScript和CSS进…

Vue前端开发:事件绑定方式

事件定义 在Vue中&#xff0c;当一个元素通过使用v-on或语法糖指令绑定某个事件后&#xff0c;则完成了事件被定义的过程&#xff0c;在这定义的过程中&#xff0c;指令的后面是定义事件的名称&#xff0c;等号的后面是事件被触发后执行的函数&#xff0c;当然&#xff0c;也可…

mac-ubuntu虚拟机(扩容-共享-vmtools)

一、磁盘扩容 使用GParted工具对Linux磁盘空间进行扩展 https://blog.csdn.net/Time_Waxk/article/details/105675468 经过上面的方式后还不够&#xff0c;需要再进行下面的操作 lvextend 用于扩展逻辑卷的大小&#xff0c;-l 选项允许指定大小。resize2fs 用于调整文件系统的…

【AAOS】【源码分析】CarSystemUI

目录 目录 概述 CarSystemUI组件 源代码 源码位置 主要模块 编译选项 CarSystemUI与SystemUI 编译方式 Car Emulator默认服务 CarSystemUI 启动流程 缩略词 概述 AAOS中的SystemUI虽然相较手机要简单不少,但却是车载开发中的一个重要组件,它负责管理和控制车机…

C++知识点复习

对于这些问题的回答&#xff0c;可以按照思维导图的结构来组织答案&#xff0c;然后再进行回答。 C11用过哪些特性&#xff1f; &#xff08;首先&#xff0c;要回答好这个问题&#xff0c;需要注意问题的层次&#xff0c;不要一上来就说新增了某某关键字和语法&#xff0c;在…

.net framework 3.5sp1开启错误进度条不动如何解决

浏览器地址栏输入www.dnz9.com远程解决netframework问题 在Windows操作系统上安装或启用.NET Framework 3.5 SP1时&#xff0c;如果遇到进度条不动的问题&#xff0c;可能由多种原因引起。以下是一些可能的解决方案&#xff1a; 1. 使用Windows功能对话框 1.打开“控制面板”。…