Spring Security 中的 UserDetailsService

在本篇博客中,我们将探讨 UserDetailsService 的重要性,以及如何通过实际示例在 Spring Security 中实现它。

理解 UserDetailsService

UserDetailsService 是 Spring Security 提供的一个接口,用于在认证过程中获取用户详细信息。DaoAuthenticationProvider 使用 UserDetailsService 来检索用户名、密码和其他属性,以完成基于用户名和密码的认证。Spring Security 提供了内存、JDBC 和缓存等 UserDetailsService 的实现。

UserDetailsService 的作用

  • 用户查找:抽象了从数据源查找用户的过程。
  • 解耦:将认证过程与应用程序的用户模型解耦。
  • 灵活性:支持多种数据源,包括数据库、LDAP 等。

在 Spring Security 中实现 UserDetailsService

实现 UserDetailsService 需要提供一个具体的实现类,用于加载用户特定的数据。本节将展示如何在 Spring 应用中实现和配置自定义的 UserDetailsService 来管理用户认证。

示例 1:自定义 UserDetailsService 实现

以下是一个简单的 UserDetailsService 实现,从数据库中获取用户详细信息。

@Service
public class CustomUserDetailsService 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 with username: " + username);}return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user));}private Collection<? extends GrantedAuthority> getAuthorities(User user) {List<GrantedAuthority> authorities = new ArrayList<>();// 示例:从用户角色中获取权限并转换为 GrantedAuthorityuser.getRoles().forEach(role -> {authorities.add(new SimpleGrantedAuthority(role.getName()));});return authorities;}
}

在这个示例中,CustomUserDetailsService 使用 UserRepository 根据用户名查找用户信息,然后构造一个实现了 UserDetails 接口的 Spring Security User 对象,封装用户的用户名、密码和权限。

示例 2:配置 AuthenticationManager 使用 UserDetailsService

实现 UserDetailsService 后,需要配置 Spring Security 使用它进行认证。这通常在安全配置类中完成。

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Autowiredprivate UserDetailsService userDetailsService;@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).formLogin(Customizer.withDefaults());return http.build();}@Beanpublic AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {return authenticationConfiguration.getAuthenticationManager();}@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

在这个配置中,AuthenticationManagerBuilder 被用来指定使用自定义的 UserDetailsService 进行认证。同时定义了一个密码编码器,以确保密码的安全处理。

总结

UserDetailsService 是 Spring Security 中用户管理的核心组件,为用户数据和 Spring Security 认证机制之间提供了无缝的桥梁。通过实现自定义的 UserDetailsService,开发者可以获得对加载用户详细信息的细粒度控制,实现强大且灵活的认证流程。

无论是使用传统的关系型数据库、NoSQL 数据库,还是外部认证提供者,UserDetailsService 都提供了适应各种安全需求的灵活性,确保用户管理既安全又高效。

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

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

相关文章

SRP 实现 Cook-Torrance BRDF

写的很乱&#xff01; BRDF&#xff08;Bidirectional Reflectance Distribution Function&#xff09;全称双向反射分布函数。辐射量单位非常多&#xff0c;这里为方便直观理解&#xff0c;会用非常不严谨的光照强度来解释说明。 BRDF光照模型&#xff0c;上反射率公式&#…

向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)

1.Locality Sensitive Hashing (LSH) 使用 Shingling MinHashing 进行查找 左侧是字典&#xff0c;右侧是 LSH。目的是把足够相似的索引放在同一个桶内。 LSH 有很多的版本&#xff0c;很灵活&#xff0c;这里先介绍第一个版本&#xff0c;也是原始版本 Shingling one-hot …

基于YOLOv8深度学习的无人机航拍小目标检测系统(PyQt5界面+数据集+训练代码)

本研究提出并实现了一种基于YOLOv8深度学习模型的无人机航拍小目标检测系统&#xff0c;旨在解决高空环境下汽车目标检测的技术难题。随着无人机技术的发展&#xff0c;航拍图像已广泛应用于交通监控、城市管理、灾害应急等多个领域。然而&#xff0c;由于无人机通常在较高的飞…

LeetCode 热题 100 回顾

目录 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 2.字母异位词分组 &#xff08;中等&#xff09; 3.最长连续序列 &#xff08;中等&#xff09; 二、双指针部分 4.移动零 &#xff08;简单&#xff09; 5.盛最多水的容器 &#xff08;中等&#xff09; 6…

使用 PyTorch 实现 ZFNet 进行 MNIST 图像分类

在本篇博客中&#xff0c;我们将通过两个主要部分来演示如何使用 PyTorch 实现 ZFNet&#xff0c;并在 MNIST 数据集上进行训练和测试。ZFNet&#xff08;ZFNet&#xff09;是基于卷积神经网络&#xff08;CNN&#xff09;的图像分类模型&#xff0c;广泛用于图像识别任务。 环…

【计算机网络实验】之静态路由配置

【计算机网络实验】之静态路由配置 实验题目实验目的实验任务实验设备实验环境实验步骤路由器配置设置静态路由测试路由器之间的连通性配置主机PC的IP测试 实验题目 静态路由协议的配置 实验目的 熟悉路由器工作原理和机制&#xff1b;巩固静态路由理论&#xff1b;设计简单…

driver.js实现页面操作指引

概述 在访问某些网站的时候&#xff0c;第一次进去你会发现有个操作指引&#xff0c;本文引用driver.js&#xff0c;教你在你的页面也加入这般高大上的操作指引。 实现效果 实现 driver.js简介 driver.js是一个功能强大且高度可定制的基于原生JavaScript开发的新用户引导库…

《C++ 实现区块链:区块时间戳的存储与验证机制解析》

在区块链这个复杂而精妙的技术架构中&#xff0c;时间戳是一个至关重要的元素&#xff0c;尤其当我们使用 C 来实现区块链时&#xff0c;对区块时间戳的存储和验证机制设计更是不容忽视。这一机制如同区块链的时间脉搏&#xff0c;为整个系统的有序运行和数据可信性提供了坚实的…

Ubuntu24.04普通安装mysql

Ubuntu24.04普通安装mysql 1、初始化mysql时报错 /opt/sudytech/mysql/bin/mysqld --initialize-insecure/opt/sudytech/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory解决方法: find …

无人机航测技术算法概述!

一、核心技术 传感器技术&#xff1a; GPS/GLONASS&#xff1a;无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机&#xff1a;用于拍摄地面图像&#xff0c;通过后续图像处理生成三维模型。 激光雷达&#xff08;LiDAR&#xff09;&#xff1a;通过激光扫…

小鹏汽车大数据面试题及参考答案

抽象类与接口的区别是什么? 抽象类是一种不能被实例化的类,它可以包含抽象方法和非抽象方法。抽象方法是没有具体实现的方法,必须在子类中被实现。抽象类主要用于为一组相关的类提供一个通用的模板,子类可以继承抽象类并实现其中的抽象方法,也可以使用抽象类中的非抽象方法…

Docker 基础命令介绍和常见报错解决

介绍一些 docker 可能用到的基础命令&#xff0c;并解决三个常见报错&#xff1a; 权限被拒绝&#xff08;Permission Denied&#xff09;无法连接到 Docker 仓库&#xff08;Timeout Exceeded&#xff09;磁盘空间不足&#xff08;No Space Left on Device&#xff09; 命令以…

Java RPC框架的接口预热原理及无损实现

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…

java的强,软,弱,虚引用介绍以及应用

写在前面 本文看下Java的强&#xff0c;软&#xff0c;弱&#xff0c;虚引用相关内容。 1&#xff1a;各种引用介绍 顶层类是java.lang.ref.Reference,注意是一个抽象类&#xff0c;而不是接口&#xff0c;其中比较重要的引用队列ReferenceQueue就在该类中定义&#xff0c;子…

已有docker增加端口号,不用重新创建Docker

已有docker增加端口号&#xff0c;不用重新创建Docker 1. 整体描述2. 具体实现2.1 查看容器id2.2 停止docker服务2.3 修改docker配置文件2.4 重启docker服务 3. 总结 1. 整体描述 docker目前使用的非常多&#xff0c;但是每次更新都需要重新创建docker&#xff0c;也不太方便&…

jmeter常用配置元件介绍总结之断言

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

Spark RDD Checkpoint 常用于需要高容错性或深度依赖链优化的场景,特别是在机器学习和大数据处理过程中。

Spark RDD Checkpoint 常用于需要高容错性或深度依赖链优化的场景&#xff0c;特别是在机器学习和大数据处理过程中。下面详细分析其适用场景、原因和典型应用示例。 1. 常用场景 1.1 复杂计算链优化 场景&#xff1a; RDD 的依赖链非常复杂&#xff08;深度很长&#xff09…

OpenLayers教程12_WebGL自定义着色器:实现高级渲染效果

在 OpenLayers 中使用 WebGL 自定义着色器实现高级渲染效果 目录 一、引言二、WebGL 自定义着色器的优势三、示例应用&#xff1a;实现动态渲染效果 1. 项目结构2. 主要代码实现3. 运行与效果 四、代码讲解与扩展 1. 动态圆的半径和填充颜色2. 动态透明度与边框效果 五、总结…

Debian 11(Bullseye)上安装 MySQL 的 ODBC 驱动程序

在 Debian Bullseye 上&#xff0c;您可以尝试安装 mysql-connector-odbc&#xff0c;但如果该包不可用&#xff0c;您可以尝试安装 libmyodbc 的替代品: 步骤 1&#xff1a;安装 odbc-mariadb 如果您还没有安装 odbc-mariadb&#xff0c;可以使用以下命令进行安装&#xff1…

Axure二级菜单下拉交互实例

1.使用boxlabe进行基础布局 2.设置鼠标悬浮和选中状态 3.转换为动态面板 选中所有二级菜单,进行按钮组转换 选中所有二级菜单,进行动态面板转换 4.给用户管理增加显示/隐藏事件 1)选择toggle代表上拉和下拉切换加载 2)勾选Bring to Front,并选择Push/Pull Widgets代表收缩时…