在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全景拍摄与制作的特点和优势&#…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
