在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全景拍摄与制作的特点和优势&#…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
