在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全景拍摄与制作的特点和优势&#…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...