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 {
    @Override
    protected 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 {
    @Autowired
    UserMapper userMapper;
    @Override
    public 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 {
    @Override
    public 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 {
    @Autowired
    CustomAuthenticationSuccessHandler authenticationSuccessHandler;
    @Autowired
    CustomAuthenticationFailureHandler authenticationFailureHandler;
    @Autowired
    CustomAuthenticationProvider authenticationProvider;

    @Override
    protected 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() //允许所有用户进行登录尝试
        ;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //super.configure(auth);
        auth.authenticationProvider(authenticationProvider);
    }
}

后续稍后更新.... 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索C嘎嘎:初步接触STL

#1024程序员节&#xff5c;征文# 前言&#xff1a; 在前文小编讲述了模版初阶&#xff0c;其实讲述模版就是为了给讲STL提前铺垫&#xff0c;STL是C中很重要的一部分&#xff0c;各位读者朋友要知道它的份量&#xff0c;下面废话不多说&#xff0c;开始走进STL的世界。 目录&am…

使用Python进行数据分析入门

文章目录 Python环境搭建安装Anaconda验证安装 必备库介绍NumPyPandasMatplotlibSciPy 数据导入与清洗导入数据清洗数据 数据探索与分析描述性统计相关性分析 数据可视化绘制直方图 高级主题机器学习深度学习 总结 随着大数据时代的到来&#xff0c;数据分析变得越来越重要。Py…

宏组学干货|一文get宏基因组产品如何选择

大家好&#xff0c;小编来分享宏基因组产品选做思路喽~ 随着微生物研究的发展和高通量测序技术的出现&#xff0c;微生物的研究迎来了宏组学技术研究时代。目前宏组学产品种类繁多&#xff0c;常见项目主要包括宏基因组、宏病毒组和宏转录组。宏基因组项目可以检测宏样本中所有…

Elasticsearch —— ES 环境搭建、概念、基本操作、文档操作、SpringBoot继承ES

文章中会用到的文件&#xff0c;如果官网下不了可以在这下 链接: https://pan.baidu.com/s/1SeRdqLo0E0CmaVJdoZs_nQ?pwdxr76 提取码: xr76 一、 ES 环境搭建 注&#xff1a;环境搭建过程中的命令窗口不能关闭&#xff0c;关闭了服务就会关闭&#xff08;除了修改设置后重启的…

【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法

【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法 文章目录 【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法1. 论文信息2. 算法介绍3. 创新点小结4. 实验效果5. 算法结论6. 代码实现7. 问题及优化方向1. 冷启动问题2. 稀…

Windows 系统安装 Hadoop 详细教程

Hadoop 是一个分布式系统基础架构&#xff0c;在大数据处理领域有着广泛的应用。在 Windows 系统上安装 Hadoop 虽然相对复杂一些&#xff0c;但只要按照步骤来&#xff0c;也可以顺利完成。本文将详细介绍在 Windows 系统下安装 Hadoop 的过程。 一、准备工作 下载 Hadoop 安装…

如何快速使用Cesium完成项目

要快速使用Cesium完成项目&#xff0c;可以按照以下步骤进行&#xff1a; 学习基础知识&#xff1a; 首先&#xff0c;了解Cesium的基本概念和功能。可以通过阅读Cesium的官方文档和一些入门教程来掌握基础知识。例如&#xff0c;可以参考“Cesium速成教程&#xff1a;一小时入…

记录一下方便的条件编译

1. 需要准备&#xff1a; 1-1、npm i cross-env -D 是跨平台的自定义编译 1-2、构造工具&#xff1a;vite/webpack > vite: import.meta.env.VITE_NODE_ENV > webpack:process.env.NODE_ENV这里使用vite为例子 1-3、 package.json 2. 思路与步骤 首先我们知道 axio…

前端开发转行做渗透测试,通过挖漏洞来赚钱

最近&#xff0c;一个做运维的朋友在学渗透测试。他说&#xff0c;他公司请别人做渗透测试的费用是 2w/人天&#xff0c;一共2周。2周 10w 的收入&#xff0c;好香~ 于是&#xff0c;我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听起来有一种敬…

网络自动化02:基于xlsx传入设备信息与所需执行备份配置命令,使用netmiko自动化登录分发

这是这个系列第二篇 本文将仅简单介绍使用xlsx导入设备信息&#xff0c;并使用netmiko配置 目录 环境设备信息表格式单线程代码解释代码逻辑分析函数解析 逻辑调用图逻辑说明 遇到的问题写在最后 环境 所有设备均能与我执行Python脚本的环境互通&#xff0c;同时均拥有独立的ip…

Knowledge-refined Denoising Network for Robust Recommendation

Knowledge-refined Denoising Network for Robust Recommendation&#xff08;Sigir23&#xff09; 摘要 知识图&#xff08;KG&#xff09;包含丰富的边信息&#xff0c;是提高推荐性能和可解释性的重要组成部分。然而&#xff0c;现有的知识感知推荐方法直接在KG和用户-项目…

数据结构 之 图的 最小生成树(十二)

提示&#xff1a;本篇难点&#xff1a; 生成树概念的理解 重点&#xff1a;是普利姆算法、克鲁斯卡尔算法构造最小生成树 超超超重点的是 普利姆和克鲁斯卡尔构造最小生成树的算法&#xff0c;这部分可能需要同学们自行去学习了。 一定要理解后用代码能够实现这两个算法已经了解…

如何清空回收站后在 Windows 11/10 中恢复已删除的文件

这篇文章将解释如何将已删除的文件、文件夹和其他项目从回收站还原或恢复到原始位置。有时&#xff0c;我们最终会删除重要的文件和文件夹&#xff0c;然后我们不知道如何将它们恢复到原来的位置。但是您不必担心&#xff0c;因为这篇针对初学者的帖子将详细指导您完成所有步骤…

Axios 请求超时设置无效的问题及解决方案

文章目录 Axios 请求超时设置无效的问题及解决方案1. 引言2. 理解 Axios 的超时机制2.1 Axios 超时的工作原理2.2 超时错误的处理 3. Axios 请求超时设置无效的常见原因3.1 配置错误或遗漏3.2 超时发生在建立连接之前3.3 使用了不支持的传输协议3.4 代理服务器或中间件干扰3.5 …

不懂知识图谱的你,正在失去转行做AI产品经理的机会

伴随着AI这块新的投资风口&#xff0c;新兴企业对AI人才的需求也是激增。所以&#xff0c;你准备好了么&#xff1f; 一、AI来了&#xff0c;你被OUT了&#xff0c;有人却已在快车道上了 给你讲个恐怖的故事&#xff1a;我今年&#xff0c;32岁了&#xff01;三十岁左右是一生…

Generating /run/initramfs/rdsosreport.txt

Linux中遇到Generating /run/initramfs/rdsosreport.txt 第一步&#xff1a;首先输入 ls /dev/mapper 第二步&#xff1a;输入 xfs_repair /dev/mapper/centos-root -L 第三步&#xff1a;重启reboot 不说原因了&#xff0c;直接上解决方式&#xff1a; 第一步&#xff1a;首先…

纯CSS实现UI设计中常见的丝带效果(5)

原文传送门&#xff1a;纯CSS实现UI设计中常见的丝带效果 网页中的丝带效果在设计中扮演着多重角色&#xff0c;其作用可以归纳为以下几个方面&#xff1a; 视觉吸引与装饰 增强视觉吸引力&#xff1a;丝带效果以其独特的形态和色彩&#xff0c;能够迅速吸引用户的注意力&…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息&#xff0c;得到4组数字块。1.5 遍历数字块&#xff0c;将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)

由于本文篇幅较长&#xff0c;分为上、中、下三篇。 一、引言 通过FFmpeg命令可以获取到FLV文件的音频压缩编码格式、音频采样率、通道数、音频码率信息&#xff1a; ./ffmpeg -i XXX.flv 而由《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简…

深度学习之降维和聚类

1 降维和聚类 1.1 图解为什么会产生维数灾难 ​ 假如数据集包含10张照片&#xff0c;照片中包含三角形和圆两种形状。现在来设计一个分类器进行训练&#xff0c;让这个分类器对其他的照片进行正确分类&#xff08;假设三角形和圆的总数是无限大&#xff09;&#xff0c;简单的…