SpringBoot整合SpringScurity权限控制(菜单权限,按钮权限)以及加上SSH实现安全传输

文章目录

    • 项目地址:
  • 一、md5 与 先进的哈希算法的区别
    • 1.1. 安全性问题
    • 1.2. 设计目的
    • 1.3. 功能特性
    • 1.4. 适用性
    • 1.5. 总结
  • 二、数据传输安全和数据加密实现:
    • 2.1 生成证书:
    • 2.2、在springboot中进行集成
      • 2.2.1 配置证书:
      • 2.2.2. 强制使用 HTTPS
        • 2.2.2.1 实现过程
      • 2.2.3 使用bcrypt 进行密码加密
        • 2.2.3.1实现过程
        • 2.2.3.2 BCryptPasswordEncoder 的实现逻辑
  • 三、权限控制:
    • 3.1、菜单权限控制
      • 3.1.1具体步骤:
    • 3.2、按钮权限:
      • 3.2.1 具体步骤:
      • 3.2.2 流程图
  • 别的
    • 在Springboot中使用Argon2进行密码加密 不依靠 SpringScurity
      • 1. 添加 Argon2 库的依赖
      • 2. 散列密码
      • 3. 验证密码
      • 4. 使用例子
      • 验证逻辑
      • 小结

项目地址:

https://github.com/yszhdhy/ItemSet/tree/master/java/secureAndSpringScurity

项目结构:
在这里插入图片描述

一、md5 与 先进的哈希算法的区别

先进的hash算法有( bcrypt、PBKDF2 或 Argon2)

实际上,使用 bcrypt、PBKDF2 或 Argon2 进行密码散列与使用 MD5 有着显著的区别,主要在于安全性和适用性。虽然 MD5 曾广泛用于密码散列,但它现在被认为是不安全的选择,主要原因如下:

1.1. 安全性问题

  • 快速计算:MD5 设计用于快速计算文件或数据的散列值,这使得它在抵抗暴力破解攻击方面表现不佳。攻击者可以使用现代的硬件在极短的时间内尝试数十亿个密码组合。
  • 碰撞弱点:MD5 已经被证明存在碰撞弱点,即可以找到两个不同的输入产生相同的输出。这种特性使其不适合进行密码存储或任何需要高安全性的场景。

1.2. 设计目的

  • MD5:最初设计为快速计算数据的散列,用于检查文件完整性,而非密码存储。
  • bcrypt/PBKDF2/Argon2:特别为密码存储设计,包括对抗散列速度过快的攻击手段,如密钥拉伸和盐值使用,这些都是为了增加密码破解的难度。

1.3. 功能特性

  • 密钥拉伸:bcrypt、PBKDF2 和 Argon2 实现了密钥拉伸功能,可以通过增加计算的时间和资源需求来有效抵抗暴力破解攻击。
  • 盐值使用:这些算法在散列密码时使用盐值,可以有效防止彩虹表攻击,即使是两个相同的密码,在加了不同的盐之后,产生的散列值也会不同。

1.4. 适用性

  • 广泛适用:虽然你提到“大多数项目都是使用 MD5 进行加密”,但实际上,在安全性意识提高和数据泄露事件频发的当下,许多现代应用和安全标准推荐使用 bcrypt、PBKDF2 或 Argon2 作为密码存储的首选方法。

1.5. 总结

如果你在设计一个需要存储用户密码的系统,强烈建议使用 bcrypt、PBKDF2 或 Argon2 而不是 MD5。这些现代算法提供了更高级别的安全保障,可以帮助你的系统抵御当前的威胁,如暴力破解和彩虹表攻击。选择正确的密码存储策略是保护用户数据安全的关键一步。

二、数据传输安全和数据加密实现:

2.1 生成证书:

  1. 执行命令

    keytool -genkeypair -alias mydomain -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore mykeystore.p12 -validity 3650 -storepass yourpassword
    

    命令详解:

    • keytool: 这是 Java 提供的一个用于管理密钥和证书的命令行工具。
    • -genkeypair: 这个参数告诉 keytool 生成一个密钥对,包括一个公钥和一个相应的私钥。
    • -alias mydomain: 这个参数指定了密钥对的别名。在之后的操作中,可以使用这个别名来引用这个密钥对。
    • -keyalg RSA: 这个参数指定了要使用的密钥算法。在这种情况下,RSA 算法被选用。
    • -keysize 2048: 这个参数指定了生成的密钥的位长度。在这个例子中,密钥的长度为 2048 位。
    • -storetype PKCS12: 这个参数指定了密钥库的类型。在这里,选择了 PKCS#12 格式。
    • -keystore mykeystore.p12: 这个参数指定了要生成的密钥库的文件名。在这个例子中,生成的密钥库将被命名为 mykeystore.p12
    • -validity 3650: 这个参数指定了生成的证书的有效期限。在这里,证书的有效期限被设置为 3650 天(大约 10 年)。
    • -storepass yourpassword: 这个参数指定了密钥库的密码。在这个例子中,密码被设置为 yourpassword。请确保将 yourpassword 替换为你自己的密码。
    • 在这里插入图片描述

2.2、在springboot中进行集成

2.2.1 配置证书:

  1. 将生成的证书放置在resource目录下在这里插入图片描述

  2. 配置yaml

    spring:application:name: demoserver:ssl:key-store: "src/main/resources/mykeystore.p12"key-store-password: xu123456keyStoreType: PKCS12   # 存储加密信息的标准文件格式keyAlias: mydomain # 别名用于从密钥库中引用具体的密钥port: 8840
    
  3. 启动项目并使用cmd 进行测试在这里插入图片描述

总结:

​ 完成以上操作后我们的所有的请求 都需要使用https进行访问。

2.2.2. 强制使用 HTTPS

2.2.2.1 实现过程
  1. 首先导入本次项目所需要的所有依赖

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.21</version></dependency></dependencies>
    
  2. 配置yaml文件

    spring:application:name: demodatasource:password: '123456'driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ceshi?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootmvc:format:date: yyyy-MM-dddate-time: yyyy-MM-dd HH:mm:ssserver:port: 8840 # HTTP端口ssl:enabled: trueport: 8843 # HTTPS端口key-store: "src/main/resources/mykeystore.p12"key-store-password: xu123456keyStoreType: PKCS12keyAlias: mydomain
    
  3. 搭建security配置文件 WebSecurityConfig

    1. 考虑在你的应用中强制使用 HTTPS,以避免数据通过不安全的 HTTP 发送。在 Spring Security 中,可以通过配置安全性策略来实现:

      @EnableWebSecurity
      public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.requiresChannel() //指定了需要使用的通道类型.anyRequest() // 指定了所有的请求.requiresSecure(); // 指定了需要使用安全的HTTPS通道}
      }
      

这样配置后,所有请求都会被重定向到 HTTPS (即使用户输入http)。

2.2.3 使用bcrypt 进行密码加密

2.2.3.1实现过程
  1. 创建密码加密配置文件 SecurityConfig 在添加用户业务中可以使用此 BCryptPasswordEncoder.encode() 方法进行加密用户密码并存储在数据库中

    package com.example.demo.config.passwordEncoder;import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;/*** @author CaptureOrNew* @description //进行密码加密配置* @date 19:29:12 2024/4/19* @return null**/
    @Configuration
    public class SecurityConfig {// 进行编码配置 创建一个BCryptPasswordEncoder的实例@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}// 配置其他安全措施...
    }
  2. 创建一个密码编辑器

    package com.example.demo.security.custom;import com.example.demo.config.passwordEncoder.SecurityConfig;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.stereotype.Component;/*** @author CaptureOrNew* @description //创建一个bcrypt 加密器* @date 19:28:21 2024/4/19* @Param* @return null**/
    @Component
    public class CustomBcryptPasswordEncoder implements PasswordEncoder {@AutowiredSecurityConfig securityConfig;// 进行密码加密操作public String encode(CharSequence rawPassword) {return securityConfig.passwordEncoder().encode(rawPassword.toString());}// 进行密码比对public boolean matches(CharSequence rawPassword, String encodedPassword) {// security 会自动进行密码的比对return securityConfig.passwordEncoder().matches(rawPassword, encodedPassword);}
    }
  3. 创建一个 UserDetailsService 接口 以及下面的实现类进行 数据库用户查询和一些鉴权判断

    package com.example.demo.security.custom;import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.stereotype.Component;@Component
    public interface UserDetailsService extends org.springframework.security.core.userdetails.UserDetailsService {/*** 根据用户名获取用户对象(获取不到直接抛异常)*/@OverrideUserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    }
    
  4. 实现类

    package com.example.demo.service.impl;import com.example.demo.model.model.SysUser;
    import com.example.demo.security.custom.CustomUser;
    import com.example.demo.service.SysUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.core.authority.SimpleGrantedAuthority;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.stereotype.Service;import java.util.ArrayList;
    import java.util.List;@Service
    public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate SysUserService sysUserService;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//根据用户名进行查询SysUser sysUser = sysUserService.getUserByUserName(username);if(null == sysUser) {throw new UsernameNotFoundException("用户名不存在!");}if(sysUser.getStatus().intValue() == 0) {throw new RuntimeException("账号已停用");}List<SimpleGrantedAuthority> authList = new ArrayList<>();return new CustomUser(sysUser, authList);}
    }
2.2.3.2 BCryptPasswordEncoder 的实现逻辑
  1. 加密 (encode) 过程
    • 用户提供一个明文密码。
    • 生成一个随机盐值(通常是每次加密时生成的)。
    • 使用明文密码和生成的盐值,通过 BCrypt 算法进行多轮散列处理。
    • 将盐值和散列结果合并成一个字符串(通常在字符串中包含盐值、散列值和用于 BCrypt 的成本参数)。
    • 返回这个合并后的字符串作为最终的存储散列。
  2. 验证 (matches) 过程
    • 用户尝试登录时提供一个明文密码。
    • 取出数据库中存储的散列密码,这个散列包含了用于该特定密码的盐值。
    • 使用存储的盐值和用户提供的明文密码再次执行相同的 BCrypt 散列过程。
    • 比较新生成的散列结果与存储的散列值是否一致。
    • 如果两者一致,说明密码匹配,用户验证成功;如果不一致,则验证失败。
  3. 流程图:
                    +-----------------------+|       用户注册        |+-----------------------+| 输入明文密码          |+-----------------------++-----------------------+| 生成随机盐值          |+-----------------------++-----------------------+| 使用 BCrypt 加密      || (密码 + 盐值)         |+-----------------------++-----------------------+| 存储散列密码到数据库  |+-----------------------++-----------------------+|       用户登录        |+-----------------------+| 输入明文密码          |+-----------------------++-----------------------+| 读取存储的散列密码    || (包含盐值)            |+-----------------------++-----------------------+| 使用读取的盐值重新    || 加密输入的明文密码    |+-----------------------++-----------------------+| 比较两个散列值是否相同|+-----------------------++-----------------------+| 相同: 验证成功        || 不同: 验证失败        |+-----------------------+

三、权限控制:

以下操作基于RBAC (角色访问控制) 权限管理模型

给用户分配角色 ——> 给角色分配权限(可对项目进行的操作)

3.1、菜单权限控制

在用户每次登录系统获取信息时,后端通过用户名和密码在数据库中进行查找此用户,如果查询到此用户就根据用户所处的角色及角色所能操作的菜单查询出来将查询到的菜单组装为前端的路由形式进行返回给前端。这样就实现了根据用户的身份角色不同,客户端就会展示相应的菜单等。

3.1.1具体步骤:

  1. 用户登录后紧接着获取菜单信息
  2. 从请求头获取用户信息即token
  3. 从数据在token中解析出登录用户的ID
  4. 根据ID查询用户信息
  5. 根据用户信息查询用户可操作的菜单
  6. 组装菜单并返回
  7. 前端通过动态路由的形式进行插入到项目中。

3.2、按钮权限:

根据用户可以操作的按钮进行来控制那些后端方法也就是接口是可以被用户所访问的(CURD)。

3.2.1 具体步骤:

  1. 前端中会根据用户登录后获取信息的接口获取到按钮权限。在前端中使用获取到的按钮权限信息对相应的按钮进行禁用或其他操作

  2. 我们后端中 security 配置类 TokenAuthenticationFilter 中进行配置获取用户按钮权限的操作并存入到security 身上

    @Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws ServletException, IOException {//如果是登录接口,直接放行if ("/admin/system/index/login".equals(request.getRequestURI())) {chain.doFilter(request, response);return;}// 获取校验信息UsernamePasswordAuthenticationToken authentication = getAuthentication(request);if (null != authentication) {SecurityContextHolder.getContext().setAuthentication(authentication);chain.doFilter(request, response);} else {ResponseUtil.out(response, Result.build(null, ResultCodeEnum.LOGIN_ERROR));}}private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {//请求头是否有tokenString username = request.getHeader("token");if (!StringUtils.isEmpty(username)) {String authListString = request.getHeader("authorities");if (!StringUtils.isEmpty(authListString)) {System.out.println(authListString+"================>");String ccc = authListString;//把redis获取字符串权限数据转换要求集合类型 List<SimpleGrantedAuthority>List<Map> maplist = JSON.parseArray(ccc, Map.class);System.out.println(maplist);List<SimpleGrantedAuthority> authList = new ArrayList<>();for (Map map : maplist) {String authority = (String) map.get("authority");authList.add(new SimpleGrantedAuthority(authority));}return new UsernamePasswordAuthenticationToken(username, null, authList);} else {return new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());}}return null;}
    
  3. 这样我们就可以直接调用security中的一个注解进行 校验:

    @PreAuthorize("hasAuthority('bnt.sysUser.list')")    /*** @author CaptureOrNew* @description //查询用户列表* @date 09:46:22 2024/4/20* @PreAuthorize 标注在方法上,表示访问方法的用户需要有对应的权限* @return com.example.demo.result.Result<java.util.List < com.example.demo.model.model.SysUser>>**/@PreAuthorize("hasAuthority('bnt.sysUser.list')")@GetMapping("getUserList")public Result<List<SysUser>> getUserList() {List<SysUser> list = sysUserService.list();return list != null ? Result.ok(list) : Result.build(null, LOGIN_ERROR);}
    
  4. 测试验证数据 这里我们是将权限放在header中了 ,没有使用redis

    const axios = require('axios');let config = {method: 'get',maxBodyLength: Infinity,url: 'https://localhost:8840/admin/getUserList',headers: { 'token': 'admin', 'authorities': '[{"authority":"bnt.sysUser.remove"},{"authority":"bnt.sysUser.add"},{"authority":"bnt.sysUser.update"}]'}
    };axios.request(config)
    .then((response) => {console.log(JSON.stringify(response.data));
    })
    .catch((error) => {console.log(error);
    });

3.2.2 流程图

  1. 用户登录在这里插入图片描述

  2. 用户添加在这里插入图片描述

别的

在Springboot中使用Argon2进行密码加密 不依靠 SpringScurity

1. 添加 Argon2 库的依赖

如果你的项目中使用 Java,你可以添加如下依赖(例如使用 argon2-jvm 库):

xmlCopy code<!-- Maven 依赖 -->
<dependency><groupId>de.mkammerer</groupId><artifactId>argon2-jvm</artifactId><version>2.8</version>
</dependency>

2. 散列密码

创建一个服务类,实现密码的散列功能。这里是一个简单的例子,展示如何使用 Argon2 进行密码散列:

javaCopy codeimport de.mkammerer.argon2.Argon2;
import de.mkammerer.argon2.Argon2Factory;public class PasswordService {private Argon2 argon2 = Argon2Factory.create();public String hashPassword(String password) {// 参数解释: 迭代次数, 内存使用量, 并行度表示算法同时使用的线程数或CPU核心数return argon2.hash(2, 65536, 1, password.toCharArray());}
}

3. 验证密码

验证过程中,你需要比较用户输入的密码与数据库中存储的散列值是否匹配。这可以通过 Argon2 的验证功能来实现:

javaCopy codepublic boolean verifyPassword(String inputPassword, String storedHash) {return argon2.verify(storedHash, inputPassword.toCharArray());
}

4. 使用例子

在你的业务逻辑中,可以使用这个服务来处理用户的密码。例如,在用户注册时散列密码,用户登录时验证密码:

javaCopy codepublic class UserService {private PasswordService passwordService = new PasswordService();// 用户注册public void registerUser(String username, String password) {String hashedPassword = passwordService.hashPassword(password);// 存储 username 和 hashedPassword 到数据库}// 用户登录public boolean loginUser(String username, String inputPassword) {// 从数据库获取存储的散列密码String storedHash = ...;return passwordService.verifyPassword(inputPassword, storedHash);}
}

验证逻辑

Argon2 的验证逻辑内部会处理与散列值相关的盐值和参数配置,所以你不需要手动处理盐值。当你调用 argon2.verify 方法时,它会解析存储的散列值,自动提取盐值和散列参数,然后使用这些信息来验证输入密码。

小结

使用 Argon2 手动处理密码散列和验证确实比直接使用 Spring Security 稍复杂一些,但这提供了更高的灵活性和控制,适合不使用 Spring Security 的项目。确保在实际部署中正确管理密码相关的安全细节,如使用安全的参数配置和及时更新依赖库。

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

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

相关文章

MySQL·索引

目录 索引的意义 索引的理解 为何IO交互要是 Page 理解Page 其他数据结构为何不行&#xff1f; 聚簇索引 VS 非聚簇索引 索引操作 主键索引操作 唯一键索引操作 普通索引的创建 总结 全文索引 索引的意义 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美…

LangChain:模型 I/O 封装使用解析和感触

目录 模型 API&#xff1a;LLM vs. ChatModel OpenAI 模型封装 多轮对话 Session 封装 换个国产模型 模型的输入与输出 Prompt 模板封装 PromptTemplate ChatPromptTemplate MessagesPlaceholder 从文件加载 Prompt 模板 TXT模板 Yaml模板 Json模板 输出封装 Out…

240512-关于如何用VSCode编写C#程序的简单说明

240512-关于如何用VSCode编写C#程序的简单说明 从安装软件开始 &#xff0c;到编写一个HelloWorld的C#文件结束&#xff0c;介绍如何用VSCode编写C#程序 1 上官网下载一个安装包 官网地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/downloads/ 2 打开安装包进…

嵌入式学习-中断控制系统

补充一下前面NVIC内嵌向量中断控制器的知识 中断 中断类型 中断控制 配置中断 优先级 分组问题 中断使能 NVIC相关库函数和作用 库函数 函数名 描述 NVIC_DeInit 将外设 NVIC 寄存器重设为初始值 NVIC_SCBDeInit 将外设 SCB 寄存器重设为初始值 NVIC_PriorityGroupCon…

Node.js全栈:从一个简单的例子开始

第一章&#xff1a;从一个简单的例子开始第二章&#xff1a;看官方文档的艺术第三章&#xff1a;浏览器显示一个网页 首先&#xff0c;在VSCode编辑器中打开一个没有任何文件的空目录&#xff0c;然后创建一个package.json文件。 为了方便大家复制&#xff0c;我把文件内容放到…

十进制整数转平衡三进制

求解原视频&#xff1a;平衡三进制 求赞&#xff01;100赞买个乒乓球拍&#xff01;_哔哩哔哩_bilibili 题目&#xff1a; 上海市计算机学会竞赛平台 | YACS 求解程序&#xff1a; using namespace std; #include <iostream> #include <cstring>string work(int n…

Zabbix6.0容器化部署(Docker-Composed)

Zabbix 为每个 Zabbix 组件提供 Docker image 作为可移植和自给自足的容器&#xff0c;以加快部署和更新过程。 Zabbix 组件在 Ubuntu、Alpine Linux 和 CentOS 基础 image 上提供:Zabbix 组件支持 MySQL 和 PostgreSQL 数据库、Apache2 和 Nginx Web 服务器。 1. Zabbix 组件…

开源流程引擎选型 —— Activiti、Flowable、Camunda

目录 一. 前言 二. 主流开源流程引擎介绍 2.1. Osworkflow 2.2. JBPM 2.3. Activiti 2.4. Flowable 2.5. Camunda 三. Flowable 与 Camunda 对比分析 3.1. 功能方面对比 3.2. 性能方面对比 四. 总结 一. 前言 市场上比较有名的开源流程引擎有 Osworkflow、JBPM、Act…

C控制语句:分支和跳转

1.1if语句 //colddays.c --找出0摄氏度以下的天数占总天数的百分比 #include <stdio.h>int main(void) {const int FREEZING 0;float temperature;int cold_days 0;int all_days 0;printf("Enter the list of daily low temperature.\n");printf("Use…

CSS - 选择器

目录 一、CSS的基本语法格式&#xff1a; 二、常见的CSS选择器 ​编辑1.标签选择器 2.类选择器 3.id选择器 4.复合选择器 5.通用选择器 三、常见的CSS样式 1.color 2.font-size 3.border 4.width/height 5.padding 6.margin 四、CSS的引入方式 1.行内引入 …

修改MTU值解决Linux下运行top命令卡死问题

上周明月的Linux服务器上运行top命令总是莫名的出现卡死现象&#xff0c;甚至是CtrlC都无法终止进程&#xff0c;今天终于抽空找到了解决办法&#xff0c;原来是需要修改Linux的MTU值&#xff0c;将服务器操作系统数据包调小&#xff0c;加上VxLAN数据包小于1500即可。 top命令…

Python 数据处理 合并二维数组和 DataFrame 中特定列的值

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 示例代码如下&#xff1a; import numpy as np import pandas as pddata {label: [1, 2, 3, 4]} df pd.DataFrame(data)values_array df[["label"]].values random_array np.random.ran…

汇聚荣科技:如何加入拼多多网店运营?

随着电子商务的迅猛发展&#xff0c;越来越多的个体商家和品牌看到了线上平台的无限潜力。作为国内领先的电商平台之一&#xff0c;拼多多吸引了众多想要开店的商家。如果你也打算在拼多多上开设自己的网店&#xff0c;那么了解如何加入并有效运营是至关重要的。下面&#xff0…

如何解决IntelliJ IDEA中pom.xml依赖项引发的安全漏洞黄线警告问题

背景 在开发过程中&#xff0c;当我们在pom.xml文件中添加依赖项时&#xff0c;经常会发现IntelliJ IDEA报出黄色警告线条&#xff0c;提示存在潜在的安全漏洞。警告的具体展现形式如下&#xff1a; 解决方案 首先&#xff0c;打开设置菜单界面&#xff0c;接着选择编辑器选…

打造清洁宜居家园保护自然生态环境,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建自然生态场景下违规违法垃圾倾倒检测识别系统

自然生态环境&#xff0c;作为我们人类赖以生存的家园&#xff0c;其健康与否直接关系到我们的生活质量。然而&#xff0c;近年来&#xff0c;一些不法分子为了个人私利&#xff0c;在河边、路边等公共区域肆意倾倒垃圾&#xff0c;严重破坏了环境的健康与平衡。这种行为不仅损…

如何利用AI提高内容生产效率与AIGC典型案例分析

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

C++——二叉树搜索树

前面写了初阶数据结构——二叉树&#xff1b;本文内容是来对它来进行结尾 目录 一概念 二实现 2.1查找 2.2插入 2.3删除 完整源代码 三二叉树的应用 四二叉搜索树的性能分析 五二叉搜索树相关的面试题 一概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树…

代码随想录——二叉树的右视图(Leetcode199)

题目链接 层序遍历 思路&#xff1a;我们可以对二叉树进行层次遍历&#xff0c;那么对于每层来说&#xff0c;最右边的结点一定是最后被遍历到的。二叉树的层次遍历可以用广度优先搜索实现。 /*** Definition for a binary tree node.* public class TreeNode {* int val…

蓝桥之链表

最近真的特别焦虑&#xff0c;体测、比赛和考试一个接一个&#xff0c;让人喘不过气来QAQ 甚至考试和比赛还有冲突&#xff0c;sad 最近因为看了牙&#xff0c;打了药的缘故&#xff0c;一直在吃素QAQ 本来今天还想写个知识点总结的&#xff0c;但是太晚了&#xff0c;现在已…

https免费证书获取

获取免费证书的网址&#xff1a; Certbot 1. 进入你的linux系统&#xff0c;先安装snapd&#xff0c; yum install snapd 2. 启动snapd service snapd start 3.安装 Certbot snap install --classic certbot 注意如下出现此错误时&#xff0c;需要先建立snap 软连接后&am…