在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的核心功能:

  1. 用户认证(Authentication):系统判断用户是否能登录
  2. 用户授权(Authorization):系统判断用户是否有权限去做某些事情

SpringSecurity特点:

  1. Spring 技术栈的组成部分,与Spring 无缝整合。
  2. 全面的权限控制,能提供完整可扩展的认证和授权支持保护
  3. 专门为 Web 开发而设计。
  4. 重量级,需要引入各种家族组件与依赖

具体实现

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对象。具体解释如下:

  1. @Service注解表示这是一个Spring的服务类,用于处理业务逻辑。
  2. 实现UserDetailsService接口,并覆盖其中的loadUserByUsername()方法。该方法的参数是用户的用户名,方法的返回值是一个UserDetails对象。在这个方法中,我们可以根据用户名查找数据库中的用户信息,然后将其封装成一个UserDetailsImpl对象返回。
  3. 在该类中注入了一个UserMapper对象,用于访问数据库。UserMapper是一个MyBatis的Mapper接口,它定义了一些操作数据库的方法。
  4. 在loadUserByUsername()方法中,我们使用了MyBatis-Plus提供的QueryWrapper对象来构造查询条件,查询指定用户名的用户信息。
  5. 如果查询结果为null,说明该用户不存在,我们抛出一个RuntimeException异常。
  6. 如果查询结果不为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接口的类,用于封装用户的详细信息。具体解释如下:

  1. @Data、@NoArgsConstructor和@AllArgsConstructor注解是Lombok注解,用于自动生成getter和setter方法,以及无参构造函数和全参构造函数。
  2. UserDetailsImpl类实现了UserDetails接口,并实现了其中的方法。UserDetails是Spring Security中的一个接口,用于封装用户的详细信息,如用户名、密码、角色等信息。
  3. 在该类中定义了一个User类型的成员变量user,用于保存从数据库中查询到的用户信息。
  4. 覆盖了getAuthorities()方法,该方法返回用户的权限信息。在这里,我们暂时返回null,表示用户没有任何权限。
  5. 覆盖了getPassword()方法,该方法返回用户的密码。
  6. 覆盖了getUsername()方法,该方法返回用户的用户名。
  7. 覆盖了isAccountNonExpired()方法,该方法返回一个boolean值,表示用户的账号是否过期。在这里,我们返回true,表示账号没有过期。
  8. 覆盖了isAccountNonLocked()方法,该方法返回一个boolean值,表示用户的账号是否被锁定。在这里,我们返回true,表示账号没有被锁定。
  9. 覆盖了isCredentialsNonExpired()方法,该方法返回一个boolean值,表示用户的凭证(如密码)是否过期。在这里,我们返回true,表示凭证没有过期。
  10. 覆盖了isEnabled()方法,该方法返回一个boolean值,表示用户是否可用。在这里,我们返回true,表示用户可用。

总的来说,这个类的作用是将数据库中的用户信息封装成一个UserDetails对象,以便于Spring Security进行身份认证和权限控制。在实际的应用中,我们需要在getAuthorities()方法中返回用户的权限信息,并在其他方法中根据需要返回相应的值。

实现config.SecurityConfig

用来实现用户密码的加密存储

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

代码具体解释

这段代码是一个Spring Security配置类,用于配置密码加密器。

具体解释如下:

  1. @Configuration注解表示这是一个Spring配置类。
  2. @EnableWebSecurity注解表示启用Spring Security的Web安全功能。
  3. 在该类中定义了一个名为passwordEncoder()的Bean,并返回一个BCryptPasswordEncoder对象。这个Bean用于对密码进行加密和解密操作。
  4. BCryptPasswordEncoder是一种密码加密器,它使用bcrypt算法对密码进行哈希加密。哈希加密是一种单向加密方式,它将原始的密码字符串转换成一个不可逆的哈希值,从而保证密码的安全性。

在实际的应用程序中,我们通常会在用户注册或修改密码时使用密码加密器对用户的密码进行加密操作,并将加密后的密码存储在数据库中。在用户登录时,我们需要对用户输入的密码进行加密,并与数据库中存储的密码进行比对。如果两者一致,则说明用户输入的密码正确,允许用户登录。而如果不一致,则说明密码错误,拒绝用户登录。

因此,密码加密器是Spring Security中非常重要的一部分,它可以提高应用程序的安全性,保护用户的隐私信息。

总结

在Web应用程序中,安全是一个非常重要的问题,Spring Security是一个强大的安全框架,可以帮助我们实现Web应用程序的安全性。在使用Spring Security时,我们需要进行以下几个步骤:

  1. 配置用户认证

    用户认证是Spring Security的核心功能之一。在认证过程中,Spring Security会使用用户提供的凭证(如用户名和密码)与应用程序中存储的凭证进行比对,以确定用户的身份是否合法。在认证过程中,我们需要配置用户信息存储方式、密码加密方式等信息。

  2. 配置授权

    在Web应用程序中,不同的用户可能需要访问不同的资源和功能。因此,我们需要配置授权,以确定哪些用户可以访问哪些资源和功能。在Spring Security中,可以使用角色或权限来进行授权管理。

  3. 配置安全策略

    在Web应用程序中,除了用户认证和授权之外,我们还需要考虑其他方面的安全问题,例如防止跨站点脚本攻击(XSS)、防止跨站点请求伪造(CSRF)等。在Spring Security中,可以使用安全策略来解决这些问题。

  4. 配置密码加密器

    在Web应用程序中,密码是一项非常重要的信息。为了保护用户的密码,我们需要使用密码加密器对密码进行加密操作。在Spring Security中,可以使用各种密码加密器来对密码进行加密和解密。

总的来说,Spring Security是一个非常强大的安全框架,可以帮助我们实现Web应用程序的安全性。在使用Spring Security时,我们需要考虑到应用程序的实际需求,进行相应的配置和调整。同时,我们也需要保持对最新的安全问题和解决方案的关注,及时更新应用程序的安全策略。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端构建(打包)工具发展史

大多同学的前端学习路线&#xff1a;三件套框架慢慢延伸到其他&#xff0c;在这个过程中&#xff0c;有一个词出现的频率很高&#xff1a;webpack 。 作为一个很出名的前端构建工具我们在网上随便一搜&#xff0c;就会有各种教程&#xff1a;loader plugin entry吧啦吧啦。 但…

企业可以申请DV https证书吗

DV https证书是有基础认证的数字证书&#xff0c;所以DV https证书也可以叫DV基础型https证书。DV基础型https证书是众多https证书中既支持个人&#xff0c;也支持企事业单位申请的https证书&#xff0c;所以企事业单位都可以申请DV基础型https证书&#xff0c;不论是企业门户网…

边写代码边学习之卷积神经网络CNN

1. 卷积神经网络CNN 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习神经网络的架构&#xff0c;主要用于图像识别、图像分类和计算机视觉等任务。它是由多层神经元组成的神经网络&#xff0c;其中包含卷积层、池化层和全连接…

【数据结构】实验十:哈夫曼编码

实验十 哈夫曼编码 一、实验目的与要求 1&#xff09;掌握树、森林与二叉树的转换&#xff1b; 2&#xff09;掌握哈夫曼树和哈夫曼编码算法的实现&#xff1b; 二、 实验内容 1. 请编程实现如图所示的树转化为二叉树。 2. 编程实现一个哈夫曼编码系统&#xff0c;系统功能…

gin通过反射来执行动态的方法

在gin中&#xff0c;可以通过反射来执行对应的方法。下面是一个示例&#xff1a; package mainimport ("fmt""github.com/gin-gonic/gin""reflect" )type UserController struct{}func (uc *UserController) GetUser(c *gin.Context) {userId :…

Flutter携带JSON参数post请求

在Flutter中发送带有JSON参数的网络请求&#xff0c;你可以使用HTTP库&#xff08;如http或dio&#xff09;来实现。以下是使用http库发送网络请求并携带JSON参数的示例&#xff1a; import package:http/http.dart as http; import dart:convert;// 创建参数Map Map<Strin…

C语言预备

安装Visual studio 官方网址 https://visualstudio.microsoft.com/zh-hans/ 选择第一个社区版本&#xff08;免费&#xff09; 下载完成后打开安装包 安装完成后会自动打开程序选择c项目然后安装即可&#xff08;c兼容c&#xff09; 安装完成后启动程序注意这里需要注册也可…

scrapy框架简单实现豆瓣评分爬取案例

豆瓣网址&#xff1a;https://movie.douban.com/top250 1.创建scrapy框架 scrapy startproject 项目名(scrapy_test_one)创建好以后的目录是这样的 2.创建spider文件 在spiders目录下创建一个spider_one.py文件&#xff0c;可以随意命名&#xff0c;该文件主要是让我们进行数…

树、二叉树(C语言版)详解

&#x1f355;博客主页&#xff1a;️自信不孤单 &#x1f36c;文章专栏&#xff1a;数据结构与算法 &#x1f35a;代码仓库&#xff1a;破浪晓梦 &#x1f36d;欢迎关注&#xff1a;欢迎大家点赞收藏关注 文章目录 &#x1f34a;树的概念及结构1. 树的概念2. 树的相关概念3.树…

解决sonar的单元测试的覆盖率会为0问题

今天做项目遇到一个问题&#xff0c;明明做单元测试时覆盖率已经百分百了&#xff0c;然后传到Jenkin上&#xff0c;构建也成功了&#xff0c;但偏偏覆盖率就是为零&#xff0c;非常确定代码没有问题&#xff0c;所以唯一的问题就是出现在配置上了。 一开始的结果如下&#xf…

css 利用模糊属性 制作水滴

<style>.box {background-color: #111;height: 100vh;display: flex;justify-content: center;align-items: center;/* 对比度*/filter: contrast(20);}.drop {width: 150px;height: 159px;border-radius: 50%;background-color: #fff;position: absolute;/* 模糊 */filt…

JavaScript Windows 浏览器对象模型

Window 对象 BOM 的核心就是 window 对象所有浏览器都支持 window 对象。它表示浏览器窗口。所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。全局变量是 window 对象的属性。全局函数是 window 对象的方法。HTML DOM 的 document 也是 window 对象的属…

Flowable-服务-微服务任务

目录 定义图形标记XML内容界面操作 定义 Sc 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Sc 任务是作为一种特殊的服务 任务来实现的&#xff0c;主要调用springcloud的微服务使用。 图形标记 由于 Sc 任务不是 BPMN 2.0 规范的“官方”任务…

CASAIM自动化平面度检测设备3D扫描零部件形位公差尺寸测量

平面度是表面形状的度量&#xff0c;指示沿该表面的所有点是否在同一平面中&#xff0c;当两个表面需要连接在一起形成紧密连接时&#xff0c;平面度检测至关重要。 CASAIM自动化平面度检测设备通过搭载领先的激光三维测头和智能检测软件自动获取零部件高质量测量数据&#xf…

vue_router__WEBPACK_IMPORTED_MODULE_1__.default is not a constructor

你所建立的项目 是 vue2x &#xff0c;但是却下载了 vue-router4x 而 vue-router4x 适用于 vue3x 所以你需要卸载 vue-router4x&#xff0c;重新下载 vue-router3x 卸载&#xff1a; npm uninstall vue-router 安装&#xff1a;(3版本&#xff09; npm i vue-router3

剑指offer刷题笔记--Num61-68

1--扑克牌中的顺子&#xff08;61&#xff09; 主要思路&#xff1a; 五个数是顺子的充要条件&#xff1a;① 最大值 - 最小值 < 5&#xff08;大小王除外&#xff09;&#xff1b;② 没有出现重复的值&#xff08;大小王除外&#xff09;&#xff1b; 判断是否出现重复的值…

【Java】java和kotlin关于Json写文件

Java写json文件 public class WriterJson {public static void main(String[] args) {// 创建一个 JSON 对象JSONObject jsonObject new JSONObject();jsonObject.put("case", "testtest");JSONObject jsonObjects new JSONObject();jsonObjects.put(&q…

IDEA如何快捷创建serialVersionUID【详细图解】

在Java Bean&#xff0c;快速创建serialVersionUID&#xff0c;详细操作流程如下&#xff1a; 1.File->Settings->Editor->Inspections 在搜索框里搜索 Uid,选择下图中勾选的选择 2.如何使用 双击选中需要序列化Uid的类名&#xff0c;使用Alt enter&#xff0c;快捷…

Webpack5 生产模式压缩图片ImageMinimizerPlugin

文章目录 一、 ImageMinimizerPlugin是什么&#xff1f;二、已经有了asset&#xff0c;为什么需要ImageMinimizerPlugin&#xff1f;三、怎么使用ImageMinimizerPlugin&#xff1f;四、ImageMinimizerPlugin压缩的成果 一、 ImageMinimizerPlugin是什么&#xff1f; 它的实际依…

Java里的static import使用小结

Java里的static import使用小结 换了工作要把Java重新捡起来了&#xff0c;这个在大学里用过的语言&#xff0c;虽然不复杂&#xff0c;还是有一些奇怪的地方的。比如static Slgluimport。 Static import是JDK 1.5中引进的特性&#xff0c;不过读大学那会还真没注意到。它的作…