当前位置: 首页 > news >正文

SpringSecurity-重写默认配置

重写UserDetailService组件

1.注入Bean的方式

/*** @author: coffee* @date: 2024/6/22 21:22* @description: 重写springsecurity默认组件:注入Bean的方式*/@Configuration
public class ProjectConfig {/*** 重写userDetailsService组件*/@Beanpublic UserDetailsService userDetailsService () {// InMemoryUserDetailsManager实现并不适用生成环境,此处进作为demo使用InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager();// 使用指定用户名、密码和权限列表构建用户UserDetails user = User.withUsername("john").password("12345").authorities("read").build();// 添加该用户以便让UserDetailsService对其进行管理userDetailsService.createUser(user);return userDetailsService;}/*** 重写UserDetailsService组件也必须重写PasswordEncoder组件,否则会报:*    java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"*/@Beanpublic PasswordEncoder passwordEncoder () {// NoOpPasswordEncoder实例会将密码视为普通文本,他不会对密码进行加密或者hash处理return NoOpPasswordEncoder.getInstance();}
}

2.扩展WebSecurityConfigurerAdapter

/*** @author: coffee* @date: 2024/6/22 21:46* @description:*/
@Configuration
public class ProjectConfig2 extends WebSecurityConfigurerAdapter {/*** 重写端点授权配置,就需要扩展WebSecurityConfigurerAdapter类,可以使用HttpSecurity对象的不同方法更改配置*/@Overrideprotected void configure (HttpSecurity httpSecurity) throws Exception {httpSecurity.httpBasic();// 所有请求都需要身份验证// httpSecurity.authorizeRequests().anyRequest().authenticated();// permitAll()方法修改授权配置,无需凭据(用户名密码)也可以直接调用接口。   curl http://localhost:8080/hellohttpSecurity.authorizeRequests().anyRequest().permitAll();}/*** 重写springsecurity默认组件:继承WebSecurityConfigurerAdapter的方式*/@Overrideprotected void configure (AuthenticationManagerBuilder auth) throws Exception {// InMemoryUserDetailsManager实现并不适用生成环境,此处进作为demo使用InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager();// 使用指定用户名、密码和权限列表构建用户UserDetails user = User.withUsername("john").password("12345").authorities("read").build();// 添加该用户以便让UserDetailsService对其进行管理userDetailsService.createUser(user);// AuthenticationManagerBuilder调用userDetailsService()方法来注册UserDetailsService实例// AuthenticationManagerBuilder调用passwordEncoder()方法来注册NoOpPasswordEncoder实例auth.userDetailsService(userDetailsService).passwordEncoder(NoOpPasswordEncoder.getInstance());}
}

重写端点授权配置

/*** @author: coffee* @date: 2024/6/22 21:46* @description:*/
@Configuration
public class ProjectConfig2 extends WebSecurityConfigurerAdapter {/*** 重写端点授权配置,就需要扩展WebSecurityConfigurerAdapter类,可以使用HttpSecurity对象的不同方法更改配置*/@Overrideprotected void configure (HttpSecurity httpSecurity) throws Exception {httpSecurity.httpBasic();// 所有请求都需要身份验证// httpSecurity.authorizeRequests().anyRequest().authenticated();// permitAll()方法修改授权配置,无需凭据(用户名密码)也可以直接调用接口。   curl http://localhost:8080/hellohttpSecurity.authorizeRequests().anyRequest().permitAll();}
}

重写AuthenticationProvider实现

/*** @author: coffee* @date: 2024/6/22 22:15* @description: ...*/
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {String userName = authentication.getName();String password = String.valueOf(authentication.getCredentials());// 重写身份验证提供者,用if else 替换 UserDetailsService和PasswordEncoderif ("john".equals(userName) && "12345".equals(password)) {return new UsernamePasswordAuthenticationToken(userName, password, Arrays.asList());} else {throw new AuthenticationCredentialsNotFoundException("ERROR");}}@Overridepublic boolean supports(Class<?> authentication) {return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);}
}
/*** @author: coffee* @date: 2024/6/22 21:46* @description:*/
@Configuration
public class ProjectConfig2 extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomAuthenticationProvider customAuthenticationProvider;/*** 重写端点授权配置,就需要扩展WebSecurityConfigurerAdapter类,可以使用HttpSecurity对象的不同方法更改配置*/@Overrideprotected void configure (HttpSecurity httpSecurity) throws Exception {httpSecurity.httpBasic();// 所有请求都需要身份验证httpSecurity.authorizeRequests().anyRequest().authenticated();}/*** 重写身份验证提供者*/@Overrideprotected void configure (AuthenticationManagerBuilder auth) throws Exception {auth.authenticationProvider(customAuthenticationProvider);}
}

相关文章:

SpringSecurity-重写默认配置

重写UserDetailService组件 1.注入Bean的方式 /*** author: coffee* date: 2024/6/22 21:22* description: 重写springsecurity默认组件&#xff1a;注入Bean的方式*/Configuration public class ProjectConfig {/*** 重写userDetailsService组件*/Beanpublic UserDetailsSer…...

C# 判断值是否在枚举里

你还在代码里面通篇通过数字的定义类型。比如type为1 表示xx,type为2 表示yy吗&#xff1f;然后程序里面通过数字1和2来判断吗&#xff1f;比如下面类似的代码&#xff1a; if(type1){ //.... } else if(type2){ //... } else if(type3){ //... } 老鸟们一般都会用枚举来定义…...

Interview preparation--elasticSearch倒排索引原理

搜索引擎应该具备哪些要求 查询速度快 优秀的索引结构设计高效率的压缩算法快速的编码和解码速度 结果准确 ElasiticSearch 中7.0 版本之后默认使用BM25 评分算法ElasticSearch 中 7.0 版本之前使用 TP-IDF算法 倒排索引原理 当我们有如下列表数据信息&#xff0c;并且系统…...

银河麒麟高级服务器操作系统V10SP2(X86)配置bond0的mac地址为指定子网卡的mac地址

银河麒麟高级服务器操作系统V10SP2&#xff08;X86&#xff09;配置bond0的mac地址为指定子网卡的mac地址 一 系统环境二 删除和备份原有配置2.1 down掉bond02.2 备份之前的bond配置到/root/bak2.3 删除bond配置&#xff08;网卡文件根据实际情况变化&#xff09; 三 新建bond0…...

python中不同维度的Tensor向量为何可以直接相加——广播机制

文章目录 广播机制示例解释广播机制如何工作代码示例输出解释广播机制的本质 在矩阵加法中&#xff0c;如果两个张量的形状不同&#xff0c;但其中一个张量的形状可以通过广播机制扩展到与另一个张量的形状相同&#xff0c;则可以进行加法操作。广播机制在深度学习框架&#xf…...

38.MessageToMessageCodec线程安全可被共享Handler

handler被注解@Sharable修饰的。 这样的handler,创建一个实例就够了。例如: ByteToMessageCodec的子类不能被@Sharable修饰 如果自定义类是MessageToMessageCodec的子类就是线程共享的,可以被@Sharable修饰的 package com.xkj.protocol;import com.xkj.message.Message; i…...

Linux中的全局环境变量和局部环境变量

Linux中的全局环境变量和局部环境变量 一、全局环境变量二、局部环境变量三、 设置全局环境变量 bash shell用一个叫作环境变量 &#xff08;environment variable&#xff09;的特性来存储有关shell会话和工作环境的信息&#xff08;这也是它们被称作环境变量的原 因&#xff…...

【研究】AI大模型需要什么样的硬件?

关注AI大模型 x 硬件的两条思路 从22年11月OpenAI推出ChatGPT至今&#xff0c;我们看到Chatbot应用的能力不断增强&#xff0c;从最初的文字问答&#xff0c;迅速向具有自主记忆、推理、规划和执行的全自动能力的AI Agent发展。我们认为端侧智能是大模型发展的重要分支。建议投…...

人工智能--自然语言处理NLP概述

欢迎来到 Papicatch的博客 目录 &#x1f349;引言 &#x1f348;基本概念 &#x1f348;核心技术 &#x1f348;常用模型和方法 &#x1f348;应用领域 &#x1f348;挑战和未来发展 &#x1f349;案例分析 &#x1f348;机器翻译中的BERT模型 &#x1f348;情感分析在…...

基于Java微信小程序火锅店点餐系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…...

SpringCloud_GateWay服务网关

网关作用 Gateway网关是我们服务的守门神&#xff0c;所有微服务的统一入口。 网关的核心功能特性&#xff1a; 请求路由和负载均衡&#xff1a;一切请求都必须先经过gateway&#xff0c;但网关不处理业务&#xff0c;而是根据某种规则&#xff0c;把请求转发到某个微服务&a…...

使用Dropout大幅优化PyTorch模型,实现图像识别

大家好&#xff0c;在机器学习模型中&#xff0c;如果模型的参数太多&#xff0c;而训练样本又太少&#xff0c;训练出来的模型很容易产生过拟合的现象。在训练神经网络时&#xff0c;过拟合具体表现在模型训练数据损失函数较小&#xff0c;预测准确率较高&#xff0c;但是在测…...

Vue3中的常见组件通信(超详细版)

Vue3中的常见组件通信 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs4. 默认…...

Stm32的DMA的学习

一&#xff0c;介绍 二&#xff0c;DMA框图 三&#xff0c;DMA通道 四&#xff0c;相关HAL库函数 五&#xff0c;配置DMA 六&#xff0c;Stm32CubeMX配置 【13.1】减少CPU传输负载 DMA直接存储器访问—Kevin带你读《STM32Cube高效开发教程基础篇》_哔哩哔哩_bilibili...

应用安全(补充)

Nessus是目前全世界最多人使用的系统漏洞扫描与分析软件。NMAP是一个网络连接端扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端。X-SCAN安全漏洞扫描工具AppScan是IBM的一款web安全扫描工具&#xff0c;可以利用爬虫技术进行网站安全渗透测试&#xff0c;根据网站入口自…...

鸿蒙开发Ability Kit(程序框架服务):【FA模型切换Stage模型指导】 app和deviceConfig的切换

app和deviceConfig的切换 为了便于开发者维护应用级别的属性配置&#xff0c;Stage模型将config.json中的app和deviceConfig标签提取到了app.json5中进行配置&#xff0c;并对部分标签名称进行了修改&#xff0c;具体差异见下表。 表1 配置文件app标签差异对比 配置项FA模型…...

通过命令行配置调整KVM的虚拟网络

正文共&#xff1a;1234 字 20 图&#xff0c;预估阅读时间&#xff1a;2 分钟 在上篇文章中&#xff08;最小化安装的CentOS7部署KVM虚拟机&#xff09;&#xff0c;我们介绍了如何在最小化安装的CentOS 7系统中部署KVM组件和相关软件包。因为没有GUI图形界面&#xff0c;我们…...

Apache POI操作excel

第1部分&#xff1a;引言 1.1 Apache POI简介 Apache POI是一个开源的Java库&#xff0c;用于处理Microsoft Office文档。自2001年首次发布以来&#xff0c;它已经成为Java社区中处理Office文档事实上的标准。Apache POI支持HSSF&#xff08;用于旧版本的Excel格式&#xff0…...

Python错误集锦:faker模块生成xml文件时提示:`xml` requires the `xmltodict` Python library

原文链接&#xff1a;http://www.juzicode.com/python-error-faker-exceptions-unsupportedfeature-xml-requires-the-xmltodict-python-library 错误提示&#xff1a; faker模块生成xml文件时提示&#xff1a; xml requires the xmltodict Python library Traceback (most r…...

Vue3-尚硅谷笔记

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...