Spring security的SecurityConfig配置时 userDetailsService报错如何解决?

news2024/9/21 10:43:05

文章目录

    • 报错信息
    • 原因
    • 解决方案
      • 1. 实现 `UserDetailsService` 接口
        • 修改 `IUsersService` 接口和实现类
      • 2. 修改 `SecurityConfig`
      • 3. 其他注意事项

报错信息

在这里插入图片描述

‘userDetailsService(T)’ in ‘org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder’ cannot be applied to ‘(com.user_service.service.IUsersService)’

原因

这个错误是因为在 SecurityConfig 配置中,AuthenticationManagerBuilderuserDetailsService 方法期待的是实现了 UserDetailsService 接口的类,而你可能传递的是 IUsersService,而它并没有实现 UserDetailsService 接口。

解决方案

要解决这个问题,你有以下几种方式:

1. 实现 UserDetailsService 接口

首先,你需要让 IUsersService 实现 UserDetailsService 接口,以便它能够被 AuthenticationManagerBuilder 使用。

修改 IUsersService 接口和实现类

你可以扩展 IUsersService 接口,使其实现 UserDetailsService,例如:

import org.springframework.security.core.userdetails.UserDetailsService;

public interface IUsersService extends IService<Users>, UserDetailsService {
    // 其他方法声明
}

然后在 UsersServiceImpl 类中实现 UserDetailsServiceloadUserByUsername 方法:

import com.user_service.entity.Users;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements IUsersService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Users user = this.getOne(new QueryWrapper<Users>().eq("username", 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(),
                new ArrayList<>());
    }
}

这样,IUsersService 就实现了 UserDetailsService,可以在 SecurityConfig 中使用。

2. 修改 SecurityConfig

SecurityConfig 中,现在可以注入 IUsersService,并将其作为 userDetailsService 使用:

import com.user_service.service.IUsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Autowired
    private IUsersService usersService;

    @Bean
    public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
        return http.getSharedObject(AuthenticationManagerBuilder.class)
                .userDetailsService(usersService) // 这里传入 usersService
                .passwordEncoder(passwordEncoder())
                .and()
                .build();
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/auth/login", "/auth/register").permitAll()
                .anyRequest().authenticated()
            )
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .addFilterBefore(new JwtAuthenticationFilter(jwtTokenUtil, signatureUtil, usersService), UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

3. 其他注意事项

  • 如果你使用了自定义的 UserDetails 实现,确保在 UsersServiceImpl 中的 loadUserByUsername 方法返回了正确的 UserDetails 实例。
  • 如果用户的角色或权限信息也存储在 Users 实体中,你需要在 loadUserByUsername 方法中将这些信息转换为 UserDetails 对象。

通过这些修改,你应该能够将 IUsersService 作为 UserDetailsService 使用,并解决上述错误。

仅为个人知识分享及开发中遇到的问题总结,
希望对你有所帮助,若有问题欢迎指正~😊

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

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

相关文章

class 7: vue.js 3 前端工程化

默认情况下&#xff0c;不能直接使用单文件组件来编写组件&#xff0c;因为浏览器不认识SFC(.vue)文件。因此&#xff0c;我们需要使用webpack或者Vite构建一个支持SFC开发的Vue.js 3环境 目录 前端发展史webpackVue CLI脚手架 前端发展史 Web早期&#xff1a;也就是互联网发展…

激光雷达产品介绍

与传统激光雷达线性重复式的扫描方式不同&#xff0c;Livox mid系列激光雷达扫描路径不会重复。且视场中激光照射到的区域面积会随时间增大&#xff0c;这就意味着视场覆盖率随时间推移而显著提高。 内容参考自《解构大疆旗下 Livox Mid 激光雷达非重复扫描技术》作者&#xff…

今天来聊一聊前端框架有哪些呢? 主流Vue和React

使用工具&#xff1a; 联网搜索 前端框架主要包括React.js、Vue.js、Angular等。在现代网络技术的快速发展中&#xff0c;前端框架成为了实现界面美观、交互性强、用户体验佳的网页和应用不可或缺的工具。下面将具体介绍几款目前主流的前端框架&#xff1a; React.js 简介&…

Spring Boot部署服务器主页事项

部署服务器 首先项目内涉及到本地路径的 你得在数据库创建一个路径 替换上服务器的路径 其次就是数据配置 第一点 非常重要 你的MySQL一定要配置允许所有ip连接 不然网站上无法连接你的数据库 根本无法运行 再就是你的MyBatis也要配置好 服务器地址要正确 数据库端口你也…

[SDK]-按钮静态文本与编辑框控件

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解按钮控件和编辑框的相关知识 控件 概念:Windows Software Development Kit&#xff08;SDK&#xff09;提供的一组可重用的用户界面元素,在应用程序使用的可视化界面&#xff0c;比如:文本框&#xff…

ini文件中的节点如何删除?

1、在某些场合中&#xff0c;会将某些数据记录本地情况&#xff0c;会有“保存/加载”过程。 比如&#xff1a; 第一次Write节点信息&#xff08;2个&#xff09;&#xff0c;如下节点 第二次Write节点信息&#xff08;1个&#xff09;&#xff0c;如下节点。会发现本来想写入…

实战项目:俄罗斯方块(六)

文章目录 &#x1f34a;自我介绍&#x1f34a;图像界面绘制界面绘制界面显示代码运行结果 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也…

检测文件解析漏洞的工具

免责声明此文档仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…

000:VTK的安装(VTK 编译 + 运行第一个例子)

VTK 医学图像处理---VTK安装 简介&#xff1a; 主要包括四个部分&#xff1a; 安装前准备&#xff08;需要下载和安装什么软件以及为什么&#xff09;&#xff1b;VTK编译与安装&#xff08;编译过程中的一些选项到底是否勾选&#xff0c;已经为什么勾选&#xff09;&#xff…

9.2-考试项目前端容器的高可用+java容器的高可用+使用docker-compose部署考试前端容器+使用docker-compose一次性创建多台容器

配置高可用的项目 基于部署考试系统的项目进行高可用 一、前端的高可用 1.先创建三个前端nginx容器&#xff0c;端口不能映射80 # 删除通用的前端容器 [roothaproxy ~]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS…

数论——拓展欧几里德算法复习

最近也是在备战比赛&#xff0c;所以也是来小小的复习了一下以前学的东西 最重要的是第一道题&#xff01; 最重要的是第一道题&#xff01; 最重要的是第一道题&#xff01; 先放拓欧板子&#xff08;不懂怎么推出了就发在评论区或者私聊&#xff09; int exgcd(int a,i…

s3fs的使用

s3fs是一个将s3服务器上的桶映射为本地目录的程序。 项目源码位于&#xff1a; https://github.com/s3fs-fuse/s3fs-fuse 这是一个比较长期的项目了&#xff0c;现在在大数据领域S3协议基本上已经成为最通用的协议。 各大云平台&#xff0c;什么阿里云&#xff0c;某为云&am…

初识Linux · 有关makefile

目录 前言&#xff1a; 1 makefile的简单使用 2 makefile介绍 前言&#xff1a; 我们上文介绍了gcc和g的基本使用&#xff0c;带了许多的子指令&#xff0c;但是有的时候啊&#xff0c;一个一个敲指令确实有点麻烦了&#xff0c;此时&#xff0c;一个工具就能派上用场&…

DDD设计方法-3-仓储,封装持久化数据

前情提要&#xff1a;一共包含 如下六篇文章&#xff08;篇幅精简&#xff0c;快速入门&#xff09; 1、初识DDD 2、聚合、实体、值对象 3、仓储&#xff0c;封装持久化数据 4、端口和适配器 5、领域事件 6、领域服务&#xff0c;实现约定 DDD设计方法-3-仓储&#xff0c;封装…

计算机网络 第2章 物理层

文章目录 通信基础基本概念信道的极限容量编码与调制常用的编码方法常用的调制方法 传输介质双绞线同轴电缆光纤以太网对有限传输介质的命名规则无线传输介质物理层接口的特性 物理层设备中继器集线器一些特性 物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&…

后端MVC三层架构,Mybatis ,雪花算法生成唯一id

一.MVC MVC(Model View Controller)&#xff0c;它是一种思想&#xff0c;他把软件系统分为 以下三部分&#xff1a; Model(模型)&#xff1a;用来处理程序中数据逻辑的部分&#xff08;service&#xff0c;dao层&#xff09; View(视图)&#xff1a;在应用程序中&#xff0…

如何把逆地理编码结果表格的不同字段都作为点标注的属性

0.序 很多行业都需要获取一些地点的信息作为gis基础数据。 如消防行业的重点建筑 交通行业的道路 智慧城市的商业楼栋等等。 这些表格信息如何叠加到地图之上&#xff0c;并能够很好的查看各个字段的信息&#xff1f; 本文的重点是把经纬度坐标的Excel表格内容转成kml&…

【Python】数据分析分类图可视化

目录 条形图 箱形图 散点图 分簇散点图 小提琴 分簇小提琴 条形图 条形图是一种直观的图表形式&#xff0c;它通过不同长度的矩形条&#xff08;即“条形”&#xff09;来展示数值变量的中心趋势估计值&#xff0c;其中每个矩形的高度直接对应于该组数据的某个中心量度&…

保存json时,保存成自己喜欢的格式的方法(而不是直接保存成格式化的json文档)

保存json时&#xff0c;不是直接保存成格式化的json文档的格式的方法 前言&#xff0c;博主是如何把格式话的json格式保存成自己喜欢的json格式的保存成格式化的json文档的格式&#xff1a;带缩进格式全部保存成一行每条数据保存成一行&#xff1a; 保存成自己喜欢的格式碎碎念…

《Rust避坑入门记》第1章:挖数据竞争大坑的滥用可变性

赵可菲是一名Java程序员&#xff0c;一直在维护一个有十多年历史的老旧系统。这个系统即将被淘汰&#xff0c;代码质量也很差&#xff0c;每次上线都会出现很多bug&#xff0c;她不得不加班修复。公司给了她3个月的内部转岗期&#xff0c;如果转不出去就会被裁员。她得知公司可…