在Spring Boot框架中集成 Spring Security
在Spring Boot框架中集成 Spring Security
目录
- 技术介绍
- SpringSecurity的核心功能:
- SpringSecurity特点:
- 具体实现
- 1、集成依赖
- 2、修改spring security
- 实现service.impl.UserDetailsServiceImpl类
- 代码1具体解释
- 代码2具体解释
- 实现config.SecurityConfig类
- 代码具体解释
- 总结
技术介绍
Spring Security是一个基于Spring框架的安全性框架,它提供了一系列的安全性服务,包括认证、授权、攻击防护等等。Spring Boot是一个快速开发应用程序的框架,它提供了很多开箱即用的功能和约定,使得构建一个Spring应用程序变得更加简单。将Spring Security集成进Spring Boot应用程序中,可以为应用程序提供基于角色的访问控制、用户身份验证等安全性的功能。
SpringSecurity的核心功能:
- 用户认证(Authentication):系统判断用户是否能登录
- 用户授权(Authorization):系统判断用户是否有权限去做某些事情
SpringSecurity特点:
- Spring 技术栈的组成部分,与Spring 无缝整合。
- 全面的权限控制,能提供完整可扩展的认证和授权支持保护
- 专门为 Web 开发而设计。
- 重量级,需要引入各种家族组件与依赖
具体实现
1、集成依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>2.7.1</version></dependency>
2、修改spring security
为了实现与数据库对接,让用户能正常登录授权,我们需要实现一些配置类
实现service.impl.UserDetailsServiceImpl类
继承自UserDetailsService接口,用来接入数据库信息
@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate UserMapper userMapper;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username", username);User user = userMapper.selectOne(queryWrapper);if (user == null) {throw new RuntimeException("用户不存在");}return new UserDetailsImpl(user);}
}
代码1具体解释
这段代码是一个实现了Spring Security中UserDetailsService接口的服务类,用于从数据库中获取用户信息并返回一个UserDetails对象。具体解释如下:
- @Service注解表示这是一个Spring的服务类,用于处理业务逻辑。
- 实现UserDetailsService接口,并覆盖其中的loadUserByUsername()方法。该方法的参数是用户的用户名,方法的返回值是一个UserDetails对象。在这个方法中,我们可以根据用户名查找数据库中的用户信息,然后将其封装成一个UserDetailsImpl对象返回。
- 在该类中注入了一个UserMapper对象,用于访问数据库。UserMapper是一个MyBatis的Mapper接口,它定义了一些操作数据库的方法。
- 在loadUserByUsername()方法中,我们使用了MyBatis-Plus提供的QueryWrapper对象来构造查询条件,查询指定用户名的用户信息。
- 如果查询结果为null,说明该用户不存在,我们抛出一个RuntimeException异常。
- 如果查询结果不为null,则将查询到的用户信息封装成一个UserDetailsImpl对象返回。UserDetailsImpl是一个实现了UserDetails接口的类,它将数据库中的用户信息封装起来,以便于Spring Security进行认证和授权。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDetailsImpl implements UserDetails {private User user;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return null;}@Overridepublic String getPassword() {return user.getPassword();}@Overridepublic String getUsername() {return user.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}
代码2具体解释
这段代码是一个实现了UserDetails接口的类,用于封装用户的详细信息。具体解释如下:
- @Data、@NoArgsConstructor和@AllArgsConstructor注解是Lombok注解,用于自动生成getter和setter方法,以及无参构造函数和全参构造函数。
- UserDetailsImpl类实现了UserDetails接口,并实现了其中的方法。UserDetails是Spring Security中的一个接口,用于封装用户的详细信息,如用户名、密码、角色等信息。
- 在该类中定义了一个User类型的成员变量user,用于保存从数据库中查询到的用户信息。
- 覆盖了getAuthorities()方法,该方法返回用户的权限信息。在这里,我们暂时返回null,表示用户没有任何权限。
- 覆盖了getPassword()方法,该方法返回用户的密码。
- 覆盖了getUsername()方法,该方法返回用户的用户名。
- 覆盖了isAccountNonExpired()方法,该方法返回一个boolean值,表示用户的账号是否过期。在这里,我们返回true,表示账号没有过期。
- 覆盖了isAccountNonLocked()方法,该方法返回一个boolean值,表示用户的账号是否被锁定。在这里,我们返回true,表示账号没有被锁定。
- 覆盖了isCredentialsNonExpired()方法,该方法返回一个boolean值,表示用户的凭证(如密码)是否过期。在这里,我们返回true,表示凭证没有过期。
- 覆盖了isEnabled()方法,该方法返回一个boolean值,表示用户是否可用。在这里,我们返回true,表示用户可用。
总的来说,这个类的作用是将数据库中的用户信息封装成一个UserDetails对象,以便于Spring Security进行身份认证和权限控制。在实际的应用中,我们需要在getAuthorities()方法中返回用户的权限信息,并在其他方法中根据需要返回相应的值。
实现config.SecurityConfig类
用来实现用户密码的加密存储
@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}
代码具体解释
这段代码是一个Spring Security配置类,用于配置密码加密器。
具体解释如下:
- @Configuration注解表示这是一个Spring配置类。
- @EnableWebSecurity注解表示启用Spring Security的Web安全功能。
- 在该类中定义了一个名为passwordEncoder()的Bean,并返回一个BCryptPasswordEncoder对象。这个Bean用于对密码进行加密和解密操作。
- BCryptPasswordEncoder是一种密码加密器,它使用bcrypt算法对密码进行哈希加密。哈希加密是一种单向加密方式,它将原始的密码字符串转换成一个不可逆的哈希值,从而保证密码的安全性。
在实际的应用程序中,我们通常会在用户注册或修改密码时使用密码加密器对用户的密码进行加密操作,并将加密后的密码存储在数据库中。在用户登录时,我们需要对用户输入的密码进行加密,并与数据库中存储的密码进行比对。如果两者一致,则说明用户输入的密码正确,允许用户登录。而如果不一致,则说明密码错误,拒绝用户登录。
因此,密码加密器是Spring Security中非常重要的一部分,它可以提高应用程序的安全性,保护用户的隐私信息。
总结
在Web应用程序中,安全是一个非常重要的问题,Spring Security是一个强大的安全框架,可以帮助我们实现Web应用程序的安全性。在使用Spring Security时,我们需要进行以下几个步骤:
-
配置用户认证
用户认证是Spring Security的核心功能之一。在认证过程中,Spring Security会使用用户提供的凭证(如用户名和密码)与应用程序中存储的凭证进行比对,以确定用户的身份是否合法。在认证过程中,我们需要配置用户信息存储方式、密码加密方式等信息。
-
配置授权
在Web应用程序中,不同的用户可能需要访问不同的资源和功能。因此,我们需要配置授权,以确定哪些用户可以访问哪些资源和功能。在Spring Security中,可以使用角色或权限来进行授权管理。
-
配置安全策略
在Web应用程序中,除了用户认证和授权之外,我们还需要考虑其他方面的安全问题,例如防止跨站点脚本攻击(XSS)、防止跨站点请求伪造(CSRF)等。在Spring Security中,可以使用安全策略来解决这些问题。
-
配置密码加密器
在Web应用程序中,密码是一项非常重要的信息。为了保护用户的密码,我们需要使用密码加密器对密码进行加密操作。在Spring Security中,可以使用各种密码加密器来对密码进行加密和解密。
总的来说,Spring Security是一个非常强大的安全框架,可以帮助我们实现Web应用程序的安全性。在使用Spring Security时,我们需要考虑到应用程序的实际需求,进行相应的配置和调整。同时,我们也需要保持对最新的安全问题和解决方案的关注,及时更新应用程序的安全策略。
相关文章:
在Spring Boot框架中集成 Spring Security
在Spring Boot框架中集成 Spring Security 目录 技术介绍SpringSecurity的核心功能:SpringSecurity特点:具体实现 1、集成依赖2、修改spring security实现service.impl.UserDetailsServiceImpl类 代码1具体解释代码2具体解释 实现config.SecurityConfi…...
登月再进一步:Apollo自动驾驶的里程碑
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…...
嵌入式一开始该怎么学?学习单片机
学习单片机: 模电数电肯定必须的,玩单片机大概率这两门课都学过,学过微机原理更好。 直接看野火的文档,芯片手册,外设手册。 学单片机不要纠结于某个型号,我认为stm32就OK,主要是原理和感觉。…...
Spring事件监听器ApplicationListener
目录 介绍 spirng启动后启动某方法 介绍 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。事件发布者并不需…...
安全学习DAY10_HTTP数据包
HTTP数据包 文章目录 HTTP数据包小节导图Request请求数据包结构Request请求方法(方式)请求头(Header)Response响应数据包结构Response响应数据包状态码状态码作用:部分状态码详解判断网站文件是否存在的状态码…...
云原生落地实践的25个步骤
一、什么是云原生? 云原生从字面意思上来看可以分成云和原生两个部分。 云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。 原生就是土生土长的意思,我们在开始…...
Stable diffusion 三大基础脚本 提示词矩阵,载入提示词,XYZ图表讲解
目录 0.本章讲解 1.提示词矩阵(prompt matrix) 1.2.提示词矩阵功能选项 1.2.1.把可变部分放在提示词文本的开头 1.2.2.为每张图片使用不同随机种子 1.2.3.选择提示词 1.2.4.选择分割符 1.2.5.宫格图边框(像素) 2.从文本框或文件载入提示词(Pro…...
uniapp uni-combox 下拉提示无匹配项(完美解决--附加源码解决方案及思路)
问题描述 匆匆忙忙又到了周一啦,一大早就来了一个头疼的问题,把我难得团团转,呜呜呜~ 下面我用代码的方式展示出来,看下你的代码是否与我的不同。 解决方案 <uni-forms-item label"名称" name"drugName&quo…...
10. Mybatis 项目的创建
目录 1. Mybatis 概念 2. 第一个 Mybits 查询 2.1 创建数据库和表 2.2 添加 Mybatis 框架支持 2.3 添加配置文件 2.4 配置 MyBatis 中的 XML 路径 2.5 添加业务代码 在学习 Mybatis 之前,我们需要知道 Mybatis 和 Spring 没有任何的关系。如果一定要强调二者…...
历年 Nobel prize in Physics (诺贝尔物理学奖)简介
历年 Fields Medal 与 Nobel prize in Physics 简介 Nobel prize in Physics 1901年12月10日 诺贝尔逝世5周年纪念日首次颁发诺贝尔奖。1916年 第一次世界大战 1914.7 至 1918.11诺贝尔物理学奖空缺1931年诺贝尔物理学奖空缺1934年诺贝尔物理学奖空缺1940年—1942年 第二次世界…...
IDEA中Git面板操作介绍 变基、合并、提取、拉取、签出
IDEA中Git面板操作介绍 变基、合并、提取、拉取、签出 面板介绍 变基、合并 提取、拉取 签出、Checkout 面板介绍 如图,在IDEA的Git面板中,仓库会分为本地仓库和远程仓库,代码仓库里面放的是各个分支。 分支前面的书签🔖标志…...
Android Studio开发简易APP添加代办事项
创建xml布局页 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width...
python 统计所有的 仓库 提交者的提交次数
字典去重 YYDS 然后再写入excel 表 yyds #!/bin/env python3 from git.repo import Repo import os import pandas as pdspath "/home/labstation/workqueue/sw" url "git10.0.128.128" date [str(x) for x in range(202307, 202308)] datefmt "%…...
018-从零搭建微服务-系统服务(五)
写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…...
HarmonyOS 开发基础(三)登录页面单向数据绑定(父组件向子组件传参)
一、目录结构认识 开发软件目录截图部分文件夹说明 文件组织结构图 二、完成单向数据绑定 index.etx // 导出方式直接从文件夹 import MyInput from "../common/commons/myInput" Entry Component /* 组件可以基于struct实现,组件不能有继承关系&am…...
发npm包
重点文件 .github -> workflow -> .yml文件 发自己的包 新建dev分支,合并到master后自动执行 fork别人的包 fork -> base dev新建本地rebase-dev分支 -> 提交push后合并至dev -> dev合并至master后自动执行 值得注意的是,fork别人的…...
<el-empty>
<el-empty> 是 Element UI 框架中提供的一个组件,用于显示空状态的占位内容。Element UI 是一套基于 Vue.js 的组件库,用于构建响应式和易用的用户界面。 <el-empty> 组件在应用中常用于以下场景: 当数据为空时,可以…...
IO流(4)- 序列化流与反序列化流
目录 1. 序列化流与反序列化流的基本介绍 2. 序列化流的基本用法? 3. 序列化流的作用? 4. 反序列化流的基本用法? 5. 反序列化流的作用 6. 序列化流与反序列化流使用时需要注意的细节(非常重要) 6.1 被序列化的…...
人工智能如何应对 DevOps 监控和可观测性挑战
自 ChatGPT 横空出世之后,AIGC 已成为不可逆转的时代浪潮。在之前的文章中,我们介绍了DevOps 领域中AI的用例,需要回顾可以点击下方链接。在本篇文章中,我将简单聊聊人工智能(AI)如何通过分析日志和指标来预…...
数字化新时代,VR全景拍摄与制作
导语: 随着科技的飞速发展,数字化图片正在引领新的时代潮流。在这个数字化图片的新时代,VR全景拍摄与制作技术正以其独特的特点和无限的优势,成为数字影像领域的一颗璀璨明星。让我们深入了解VR全景拍摄与制作的特点和优势&#…...
论计算机科学的本质是什么?编程么?
计算机科学的本质不是编程。编程只是实现计算机科学思想的工具和手段,而非其内核。计算机科学的核心是“计算”与“问题求解”计算机科学(Computer Science, CS)本质上是一门研究信息与计算的理论基础,以及如何通过算法高效、可靠…...
GPT-SoVITS WebUI 终极指南:5分钟快速上手一站式语音合成解决方案
GPT-SoVITS WebUI 终极指南:5分钟快速上手一站式语音合成解决方案 【免费下载链接】GPT-SoVITS 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) 项目地址: https://gitcode.com/GitHub_Trending/gp/GPT-SoVITS GPT…...
低成本GPU算力优化:cv_unet_image-colorization显存占用实测与调优
低成本GPU算力优化:cv_unet_image-colorization显存占用实测与调优 1. 项目背景与价值 在数字影像修复领域,AI图像上色技术正成为越来越受欢迎的工具。基于UNet架构的cv_unet_image-colorization模型,通过深度学习算法能够智能识别黑白图像…...
FLUX.2-klein-base-9b-nvfp4进阶:利用LSTM时序理解优化视频连贯风格转换
FLUX.2-klein-base-9b-nvfp4进阶:利用LSTM时序理解优化视频连贯风格转换 最近在折腾视频风格转换时,发现一个挺让人头疼的问题:用那些单帧处理的模型,出来的视频总是一闪一闪的,风格也忽明忽暗,看着特别不…...
【JAVA基础面经】深拷贝与浅拷贝
文章目录基本概念浅拷贝深拷贝重写 clone() 方法实现深拷贝使用序列化实现深拷贝使用复制构造函数或工厂方法基本概念 浅拷贝:创建一个新对象,然后将原对象的非静态字段(基本类型和引用类型)直接复制到新对象中。对于引用类型字段…...
爆火Agent Harness:驯服AI的终极秘籍,三大巨头如何让AI从玩具变工具?
文章深入探讨了Agent Harness在AI落地中的关键作用,指出当前许多Agent应用存在长程任务失忆、遗留代码迷路、生成交付断链、确定性和安全性翻车等问题。文章剖析了Anthropic、OpenAI、LangChain三大巨头的Harness实践,如Anthropic的脚手架和独立评估器解…...
跨平台部署YOLOv5的路径陷阱:从WindowsPath错误看Python pathlib的兼容性设计
1. 当WindowsPath遇上Linux:YOLOv5部署的路径陷阱 最近帮朋友调试一个YOLOv5模型部署问题,场景特别典型:在Windows训练好的目标检测模型,迁移到Linux服务器就报错。错误信息直指一个看似简单的路径问题:"NotImple…...
别再只数步数了!深入聊聊ADXL345计步算法里的‘动态阈值’与‘最活跃轴’
别再只数步数了!深入聊聊ADXL345计步算法里的‘动态阈值’与‘最活跃轴’ 当你盯着智能手环上的步数统计时,有没有想过这串数字背后藏着怎样的算法智慧?ADXL345作为一款经典的三轴加速度传感器,其计步算法远非简单的阈值比较那么简…...
【数据结构】树的定义、核心术语与关键性质全解析
在数据结构的世界里,树(Tree) 是一种极其重要的非线性结构,它完美模拟了自然界中树的层次关系,从文件系统、组织结构,到算法中的二叉搜索树、堆,再到 AI 中的决策树,树的身影无处不在…...
Docker 容器技术 第一节---定义、概念、安装CentOS 7 Linux系统、MobaXterm中安装docker-ce
一、Docker的定义Docker是一款开源的容器化平台,它能将应用及其依赖的环境、配置、库等打包成轻量可移植的容器,既保证了不同环境下应用运行的一致性,又以共享宿主机内核的方式实现了比传统虚拟机更高效的资源利用和秒级启动速度,…...
