后端进阶之路——万字总结Spring Security与数据库集成实践(五)

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」

java一站式服务
前端炫酷代码分享
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
★ 数据流通的精妙之道★

★后端进阶之路★

请添加图片描述

文章目录

  • 前言
  • 1. 引言
    • 使用数据库集成Spring Security的目的和好处
  • 2. 数据库设计与配置
    • 2.1 用户表的结构和字段
    • 2.2 角色表的结构和字段
    • 2.3 配置Spring Security与数据库的连接
  • 3. 用户认证
    • 3.1 实现基于数据库的用户认证功能
    • 3.2 使用Spring Security的Encoder进行密码加密和验证
    • 4.3 自定义用户认证的逻辑和处理方式
  • 4. 用户授权
    • 4.1 基于数据库的用户授权功能
    • 4.2 在数据库中定义角色和权限
    • 4.3 配置权限验证规则和授权方式
    • 4.4 自定义用户授权的逻辑和处理方式
  • 小结

在这里插入图片描述

1. 引言

使用数据库集成Spring Security的目的和好处

  1. 数据库作为存储用户信息的可靠源:将用户信息存储在数据库中可以保证其持久性和安全性,并且可方便地进行管理和维护。

  2. 灵活的用户认证和授权配置:通过数据库集成,可以实现对不同用户的不同认证和授权方式,例如基于角色的访问控制或基于权限的细粒度控制。

  3. 可拓展性和可定制化:通过数据库集成,可以轻松地添加新的用户、角色和权限,并且能够根据具体需求进行自定义身份验证和授权逻辑的开发。

  4. 统一管理用户信息:通过数据库集成,可以实现统一管理用户信息。当用户信息发生变化时,例如更改密码、添加或删除角色等,只需在数据库中进行修改即可。

在本文中,我们将深入探讨如何将Spring Security与数据库集成,实现基于数据库的用户身份验证和授权。我们将介绍Spring Security的基本概念和功能,讨论数据库设计和配置的具体细节,并提供完整的示例代码来演示这种集成方式的实际应用。通过阅读本文,读者将能够理解和应用这种集成方式,构建安全可靠的认证和授权系统。

在这里插入图片描述

2. 数据库设计与配置

在使用数据库进行身份验证和授权时,我们需要设计和配置适合存储用户信息和角色信息的数据库结构。这些信息通常存储在两张表中:用户表和角色表。

2.1 用户表的结构和字段

用户表通常包含以下字段:

  • id: 用户的唯一标识符
  • username: 用户名
  • password: 经过加密的密码
  • enabled: 标识用户是否启用(例如,激活状态)
  • 其他可选字段,如emailphone

以下是一个示例用户表的SQL定义:

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(64) NOT NULL,password VARCHAR(256) NOT NULL,enabled BOOLEAN NOT NULL,email VARCHAR(128),phone VARCHAR(16)
);

2.2 角色表的结构和字段

角色表用于定义不同用户角色,并且与用户表之间存在关联。角色表通常包含以下字段:

  • id: 角色的唯一标识符
  • name: 角色名称

以下是一个示例角色表的SQL定义:

CREATE TABLE roles (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(64) NOT NULL
);

2.3 配置Spring Security与数据库的连接

在Spring Security中配置与数据库的连接,需要提供数据库的连接信息、用户名、密码等配置。我们可以使用Spring的配置文件(如application.properties)或Java配置类来配置数据库连接。

以下是一个示例的application.properties文件配置数据库连接:

spring.datasource.url=jdbc:mysql://localhost:3306/security_db
spring.datasource.username=db_username
spring.datasource.password=db_password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

在Spring Security配置中,我们需要配置一个UserDetailsService,它负责从数据库中加载用户信息并提供给Spring Security进行身份验证和授权。

以下是一个示例的Java配置类示例,其中配置了UserDetailsService

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate DataSource dataSource;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username = ?").authoritiesByUsernameQuery("SELECT u.username, r.name FROM users u, roles r, user_roles ur WHERE u.id = ur.user_id AND r.id = ur.role_id AND u.username = ?");}// Other security configurations...
}

在上述示例中,我们通过dataSource注入配置的数据库连接。usersByUsernameQueryauthoritiesByUsernameQuery用于自定义查询用户信息和角色/权限的SQL语句。

通过以上的数据库设计和配置,我们可以建立一个与Spring
Security集成的数据库,以存储用户和角色信息,并通过配置文件或Java配置类与Spring
Security建立连接。这将为我们的身份验证和授权提供基础。

3. 用户认证

用户认证是确保用户身份有效性的过程。在基于数据库的用户认证中,我们将使用Spring Security来实现用户认证功能。

3.1 实现基于数据库的用户认证功能

通过配置UserDetailsService,我们可以从数据库中加载用户信息,并将其与用户提交的凭据进行比较以验证其身份。

以下是一个示例的UserDetailsService实现类,用于从数据库中加载用户信息:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found");}return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),user.getAuthorities());}
}

在上述示例中,我们注入了UserRepository,该接口用于查询数据库中的用户信息。

3.2 使用Spring Security的Encoder进行密码加密和验证

为了保护用户密码的安全性,我们需要对密码进行加密并进行比较。Spring Security提供了多种加密方式,例如BCrypt、SHA-256等。

以下是一个示例的密码加密和验证示例:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate PasswordEncoder passwordEncoder;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder);}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}// Other security configurations...
}

在上述示例中,我们配置了一个PasswordEncoder bean,并将其注入到AuthenticationManagerBuilder中。这样,当用户登录时,Spring Security会自动将用户输入的密码与数据库中存储的加密密码进行比较。

4.3 自定义用户认证的逻辑和处理方式

通过实现UserDetailsService接口和使用PasswordEncoder,我们可以实现基于数据库的用户认证。但有时我们可能需要自定义用户认证的逻辑和处理方式。

以下是一个示例的自定义用户认证的配置示例:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.authenticationProvider(customAuthenticationProvider());}@Beanpublic AuthenticationProvider customAuthenticationProvider() {CustomAuthenticationProvider authenticationProvider = new CustomAuthenticationProvider();authenticationProvider.setUserDetailsService(userDetailsService);authenticationProvider.setPasswordEncoder(passwordEncoder());return authenticationProvider;}// Other security configurations...
}

在上述示例中,我们实现自定义的CustomAuthenticationProvider,并将其注册为AuthenticationProviderCustomAuthenticationProvider可以实现自定义的用户认证逻辑,例如通过额外的验证步骤、读取其他系统的用户信息等。

以下是一个示例的CustomAuthenticationProvider类:

public class CustomAuthenticationProvider implements AuthenticationProvider {private UserDetailsService userDetailsService;private PasswordEncoder passwordEncoder;@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {String username = authentication.getName();String password = authentication.getCredentials().toString();UserDetails userDetails = userDetailsService.loadUserByUsername(username);if (passwordEncoder.matches(password, userDetails.getPassword())) {return new UsernamePasswordAuthenticationToken(username, password, userDetails.getAuthorities());} else {throw new BadCredentialsException("Invalid credentials");}}@Overridepublic boolean supports(Class<?> authentication) {return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);}// Setter methods for UserDetailsService and PasswordEncoder
}

在上述示例中,我们通过UserDetailsService加载用户信息,并使用PasswordEncoder验证密码。如果用户认证通过,我们创建一个UsernamePasswordAuthenticationToken对象来表示成功的认证。

通过自定义用户认证逻辑和处理方式,我们可以灵活地应对各种特定的认证需求,如双因素身份验证、第三方认证等。

通过以上的实现和配置,我们可以实现基于数据库的用户认证。Spring Security将会验证用户提交的凭证,并根据数据库中的用户信息进行身份验证。为了保障密码的安全性,我们可以使用SpringSecurity提供的加密方式对密码进行加密和验证。同时,如果需要自定义用户认证逻辑和处理方式,我们可以实现自己的CustomAuthenticationProvider来满足特定的需求。
在这里插入图片描述

4. 用户授权

用户授权是为了确定用户能够访问系统中特定资源的权限。在基于数据库的用户授权功能中,我们将使用数据库中定义的角色和权限进行授权操作。

4.1 基于数据库的用户授权功能

通过配置Spring Security,我们可以使用数据库中定义的角色和权限对用户进行授权。

以下是一个示例的权限验证规则和授权方式的配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("ADMIN", "USER").anyRequest().authenticated().and().formLogin().and().logout();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService);}// Other security configurations...
}

在上述示例中,我们通过antMatchers定义了不同URL路径的权限验证规则。例如,"/admin/“路径需要具有"ADMIN"角色才能访问,而”/user/"路径需要具有"ADMIN"或"USER"角色才能访问。

4.2 在数据库中定义角色和权限

为了实现基于数据库的用户授权功能,我们需要在数据库中定义角色和权限。

以下是一个示例的角色表和权限表的定义:

CREATE TABLE roles (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(64) NOT NULL
);CREATE TABLE permissions (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(64) NOT NULL
);

然后,我们需要定义用户与角色之间的关联,以及角色与权限之间的关联。

以下是一个示例的用户角色关联表和角色权限关联表的定义:

CREATE TABLE user_roles (user_id INT NOT NULL,role_id INT NOT NULL,PRIMARY KEY (user_id, role_id),FOREIGN KEY (user_id) REFERENCES users(id),FOREIGN KEY (role_id) REFERENCES roles(id)
);CREATE TABLE role_permissions (role_id INT NOT NULL,permission_id INT NOT NULL,PRIMARY KEY (role_id, permission_id),FOREIGN KEY (role_id) REFERENCES roles(id),FOREIGN KEY (permission_id) REFERENCES permissions(id)
);

通过以上的数据库定义,我们可以在数据库中建立用户、角色和权限的关联关系,并在用户授权时使用。

4.3 配置权限验证规则和授权方式

在上述的Spring Security配置中,我们使用antMatchers定义了访问路径的权限验证规则,并指定了需要具有哪些角色才能访问对应的路径。

除了使用角色进行访问控制外,我们也可以使用权限进行访问控制。权限是角色的组成部分,每个角色可以具有多个权限。

以下是一个示例的权限验证规则和授权方式的配置,基于数据库中的角色和权限:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasAuthority("ADMIN_ACCESS").antMatchers("/user/**").hasAnyAuthority("ADMIN_ACCESS", "USER_ACCESS").anyRequest().authenticated().and().formLogin().and().logout();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService);}// Other security configurations...
}

在上述示例中,我们使用hasAuthorityhasAnyAuthority来配置权限验证规则。例如,"/admin/“路径需要具有"ADMIN_ACCESS"权限才能访问,而”/user/"路径需要具有"ADMIN_ACCESS"或"USER_ACCESS"权限才能访问。

4.4 自定义用户授权的逻辑和处理方式

通过自定义UserDetailsServiceAuthenticationProvider,我们可以实现自定义的用户授权逻辑和处理方式。

例如,在UserDetailsService中,我们可以根据具体的业务逻辑从数据库中加载用户信息和授权信息。在AuthenticationProvider中,我们可以实现自定义的授权逻辑,例如根据用户的其他属性进行额外的授权判断。

通过自定义用户授权的逻辑和处理方式,我们可以灵活地定义和调整系统中的权限控制方式,以满足不同的业务需求。

小结

这篇文章的主要目标是展示如何将Spring Security与数据库集成,实现基于数据库的用户身份认证和授权。通过引入数据库,并配合Spring Security的功能和配置,可以构建一个安全可靠的用户认证和授权系统
在这里插入图片描述

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

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

相关文章

【Excel】记录Match和Index函数的用法

最近一直用到的两个处理EXCEL表格数据的函数向大家介绍一下&#xff0c;写这篇博文的目的也是为了记录免得自己忘记了&#xff0c;嘻嘻。 先上百度的链接 Match函数的用法介绍&#xff1a;https://jingyan.baidu.com/article/2fb0ba40b4933941f3ec5f71.html 小结&#xff1a;…

Sql server 2005 卸载之后重新安装

Sql server 2005 卸载之后重新安装 Sql sercer 2005在重新安装之前先要进行卸载操作&#xff0c;由于Sql sercer 2005组件都是分散的&#xff0c;所以卸载时要找到对应的位置一个一个卸载&#xff0c;不卸载干净的情况下再次安装时会出现很多问题&#xff0c;导致安装失败。这…

【前瞻】视频技术的发展趋势讨论以及应用场景

视频技术的发展可以追溯到19世纪初期的早期实验。到20世纪初期&#xff0c;电视技术的发明和普及促进了视频技术的进一步发展。 1&#xff09;数字化&#xff1a;数字化技术的发明和发展使得视频技术更加先进。数字电视信号具有更高的清晰度和更大的带宽&#xff0c;可以更快地…

Qt--动态链接库的创建和使用

写在前面 在Qt的实际开发中&#xff0c;免不了使用和创建动态链接库&#xff0c;因此熟悉Qt中动态链接库的创建和使用对后续的库开发或使用是非常用必要的。 在之前的文章https://blog.csdn.net/SNAKEpc12138/article/details/126189926?spm1001.2014.3001.5501中已经对导入…

【有趣的设计模式】23 种设计模式详解和场景分析

前言 七大设计原则 1、单一原则&#xff1a;一个类只负责一个职责 2、开闭原则&#xff1a;对修改关闭&#xff0c;对扩展开放 3、里氏替换原则&#xff1a;不要破坏继承关系 4、接口隔离原则&#xff1a;暴露最小接口&#xff0c;避免接口过于臃肿 5、依赖倒置原则&#xff1…

高级web前端开发工程师的职责说明(合集)

高级web前端开发工程师的职责说明1 职责&#xff1a; 1、根据需求文档&#xff0c;完成PC端、移动端页面及交互的开发&#xff0c;并保证兼容性和确保产品具有优质的用户体验; 2、熟练使用 HTML 、 CSS 、 JS 、 Ajax 等技术&#xff0c;能解决各种浏览器兼容性问题&#xff…

[回馈]ASP.NET Core MVC开发实战之商城系统(五)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;在之前的文章中&#xff0c;讲解了商城系统的整体功能设计&#xff0c;页面布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页【商品类型&#xff0c;ba…

orangepi 4lts ubuntu安装RabbitMQ

4lts的emmc 系统安装选文件系统格式 ext4 需先安装erlang&#xff1a; sudo apt install erlang 安装RabbitMQ: sudo apt install rabbitmq-server - 添加用户以便远程访问&#xff1a; - 账号密码都是admin: sudo rabbitmqctl add_user admin admin -sudo rabbitmqct…

使用爬虫代理IP速度慢是什么原因?

你们有没有遇到过使用爬虫代理IP速度慢的问题呢&#xff1f;相信很多使用爬虫抓取的人都曾经陷入过这个烦恼&#xff0c;今天我们就来聊聊这个话题。 首先&#xff0c;我们得明白为什么爬虫代理IP速度会变得慢。其实&#xff0c;原因有很多&#xff0c;比如代理服务器过多的连接…

auto-changelog的简单使用

auto-changelog的简单使用 自动化生成Git提交记录&#xff0c;CHANGELOG.md文件 github&#xff1a;https://github.com/cookpete/auto-changelog 安装 npm install -g auto-changelog配置脚本 package.json文件下 "scripts": {"changelog": "aut…

【Jmeter】配置不同业务请求比例,应对综合场景压测

目录 前言 Jmeter5.0新特性 核心改进 其他变化 资料获取方法 前言 Jmeter 5.0这次的核心改进是在许多地方改进了对 Rest 的支持&#xff0c;此外还有调试功能、录制功能的增强、报告的改进等。 我也是因为迁移到了Mac&#xff0c;准备在Mac上安装Jmeter的时候发现它已经…

blender 毛发粒子

新建平面&#xff0c;点击右侧粒子系统&#xff0c;选择毛发&#xff0c;调整毛发长度&#xff0c;数量&#xff08;Number&#xff09;&#xff0c;调整数量是为了避免电脑卡顿&#xff1b; 上面设置的每一根柱子都可以变成一个物体&#xff0c;点击渲染&#xff0c;渲染为选择…

EdgeBox_tx1_A200 PyTorch v1.9.0 环境部署

大家好&#xff0c;我是虎哥&#xff0c;今天远程帮助几个小伙伴在A200 控制器上安装PyTorch v1.9.0 torchvision v0.10.0&#xff0c;中间也是经历了很多波折&#xff0c;当然&#xff0c;大部分是网络问题和版本适配问题&#xff0c;所以完事后&#xff0c;将自己完整可用的过…

论文阅读 - Few-shot Network Anomaly Detection via Cross-network Meta-learning

论文链接&#xff1a;https://arxiv.org/pdf/2102.11165.pdf 目录 摘要&#xff1a; 引言 问题定义 方法 Graph Deviation Networks Cross-network Meta-learning 摘要&#xff1a; 网络异常检测旨在找到与绝大多数行为显着不同的网络元素&#xff08;例如节点、边、子图…

JNI之Java实现蓝牙交互

蓝牙概述 蓝牙&#xff0c;是一种支持设备短距离通信&#xff08;一般10m内&#xff09;的无线电技术&#xff0c;能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间&#xff0c;通过蓝牙设备之间的无线通信实现数据传输&#xff0c;实现数据传输&#xf…

【汇总】解决Ajax请求后端接口,返回ModelAndView页面不跳转

【汇总】解决Ajax请求后端接口&#xff0c;返回ModelAndView不跳转 问题发现问题解决方法一&#xff1a;直接跳转到指定URL&#xff08;推荐&#xff09;方法二&#xff1a;将返回的html内容&#xff0c;插入到页面某个元素中方法三&#xff1a;操作文档流方法四&#xff1a;使…

docker更换数据存储路径

1. 先停掉docker服务 sudo systemctl stop docker 可能会出现的问题&#xff1a; 这样会导致docker关闭失败,解决办法&#xff1a;systemctl stop docker.socket 确保docker关闭: 2.备份现在的 Docker 数据存储目录 /var/lib/docker(默认路径) mv /var/lib/docker /var/lib/…

在IDEA同一个窗口中同时打开多个独立项目

文章说明 本文主要说明如何在Intellij Idea中同时打开多个独立的Maven项目。 我在使用idea的时候&#xff0c;由于自己负责了很多项目&#xff0c;经常要在不通的代码之间切换来切换去。然后搜索代码的时候也只能搜到当前打开的这个项目。因为这个原因&#xff0c;一些小项目…

vscode无法连接远程服务器的可能原因:远程服务器磁盘爆了

vscode输入密码后一直等待&#xff0c;无法进入远程服务器终端&#xff1a; 同时Remote-SSH输出包含以下内容 在日志中的以下几个部分&#xff1a; [17:15:05.529] > wget download failed 这表明VS Code尝试在远程服务器上下载VS Code服务器时失败了。> Cannot write…

多模态学习

一、目标 三、多模态核心任务 题目&#xff1a;