Spring Security授权案例集合
目录
- 授权
- 前置内容
- 权限表的设计
- 建表和相关说明
- 用户权限配置
- 内部关键类GrantedAuthority和SimpleGrantedAuthority
- 关键类使用示例
- 资源访问控制
- 方法一、配置类设置访问控制
- 方法二、注解类设置访问控制(优选)
- 权限不足的处理方法
授权
前置内容
描述:授权是指认证通过后,系统赋予用户一定的权限,而用户能根据此权限,访问系统中的某些资源
授权方式:RBAC
基于角色的访问控制(一般不用)
直接给某个角色赋予访问权限
角色A有权利访问资源a,但当A发生变化时,则需要进行修改
基于资源的访问控制(常用)
根据角色拥有的资源权限,赋予额外的资源权限
角色A有权利访问资源a
+
访问资源a的所有角色有权利访问资源b
---->>
角色A可以访问资源b
权限表的设计
用户与权限的关系:多对多
原则设计:设计中间表,降低范式化程度
用户、角色、权限:
如果只有用户和权限两表,操作量会非常大,因此增加角色表和两个中间表,保证低范式。
建表和相关说明
表说明
权限
角色
角色权限关系表
用户
用户角色关系表
建表代码
CREATE TABLE `users` (`uid` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `users` VALUES (1, 'baizhan', '$2a$10$Eqv9PRMl6bPt5BiwgPr2eucgyl.E.xLENt4bvfDvv7DyS5AVPT.U6', '13812345678');CREATE TABLE `role` (`rid` int(11) NOT NULL AUTO_INCREMENT,`roleName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`roleDesc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`rid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `role` VALUES (1, '总经理', '管理整个公司');
INSERT INTO `role` VALUES (2, '股东', '参与公司决策');
INSERT INTO `role` VALUES (3, '财务', '管理公司资产');CREATE TABLE `permission` (`pid` int(11) NOT NULL AUTO_INCREMENT,`permissionName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`pid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `permission` VALUES (1, '查询报表', '/reportform/find');
INSERT INTO `permission` VALUES (2, '查询工资', '/salary/find');
INSERT INTO `permission` VALUES (3, '查询税务', '/tax/find');CREATE TABLE `users_role` (`uid` int(255) NOT NULL,`rid` int(11) NOT NULL,PRIMARY KEY (`uid`, `rid`) USING BTREE,INDEX `rid`(`rid`) USING BTREE,CONSTRAINT `users_role_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`uid`) ON DELETE RESTRICT ON UPDATE RESTRICT,CONSTRAINT `users_role_ibfk_2` FOREIGN KEY (`rid`) REFERENCES `role` (`rid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `users_role` VALUES (1, 2);
INSERT INTO `users_role` VALUES (1, 3);CREATE TABLE `role_permission` (`rid` int(11) NOT NULL,`pid` int(11) NOT NULL,PRIMARY KEY (`rid`, `pid`) USING BTREE,INDEX `pid`(`pid`) USING BTREE,CONSTRAINT `role_permission_ibfk_1` FOREIGN KEY (`rid`) REFERENCES `role` (`rid`) ON DELETE RESTRICT ON UPDATE RESTRICT,CONSTRAINT `role_permission_ibfk_2` FOREIGN KEY (`pid`) REFERENCES `permission` (`pid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `role_permission` VALUES (1, 1);
INSERT INTO `role_permission` VALUES (2, 1);
INSERT INTO `role_permission` VALUES (1, 2);
INSERT INTO `role_permission` VALUES (3, 2);
INSERT INTO `role_permission` VALUES (1, 3);
INSERT INTO `role_permission` VALUES (2, 3);
用户权限配置
内部关键类GrantedAuthority和SimpleGrantedAuthority
描述:GrantedAuthority是security内部中的权限接口,SimpleGrantedAuthority是前者的一个简单实现。
使用说明:
创建GrantedAuthority列表存储所有的用户权限,存入的是SimpleGrantedAuthority的实例,SimpleGrantedAuthority每个实例在创建时,需要写入权限信息(String类型),写入方式一般为自己创建的权限实体类
关键类使用示例
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
for (Permission permission : permissions) {grantedAuthorities.add(new SimpleGrantedAuthority(permission.getUrl()));
}
用户权限配置完整代码
此类的作用是负责处理用户、权限和数据库部分的交互逻辑
内部只定义了一个方法,用于根据给定用户名,加载用户信息(包含权限内容),用于进行授权
根据用户名加载一个用户时,会从数据库中读取这个用户的相应权限和其他信息,同时这些信息被写入到这个用户实例上,完成了授权操作
package com.wunaiieq.tmp2024121105.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wunaiieq.tmp2024121105.entity.Permission;
import com.wunaiieq.tmp2024121105.entity.Users;
import com.wunaiieq.tmp2024121105.mapper.UsersMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
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 MyUserDetailService implements UserDetailsService {@Autowiredprivate UsersMapper usersMapper;//自定义认证逻辑@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//1.查询条件QueryWrapper<Users> wrapper = new QueryWrapper<Users>().eq("username", username);//2.查询用户Users users = usersMapper.selectOne(wrapper);if (users == null){return null;}//3.查询用户权限,用我们自定义的Permission类去接收,捕获成一个列表List<Permission> permissions = usersMapper.findPermissionByUsername(username);//4.将自定义的权限集合转换为security规定的权限集合List<GrantedAuthority> grantedAuthorities = new ArrayList<>();for (Permission permission : permissions) {grantedAuthorities.add(//将实例添加到grantedAuthorities集合中new SimpleGrantedAuthority(//将下面获取到的权限(字符串形式)创建出SimpleGrantedAuthority的示例permission.getUrl()//调用列表中每个Permission对象的getUrl()方法,获取权限));}//5.封装为UserDetails对象UserDetails userDetails = User.withUsername(users.getUsername()).password(users.getPassword()).authorities(grantedAuthorities).build();//4.返回封装好的UserDetails对象return userDetails;}
}
资源访问控制
方法一、配置类设置访问控制
controller
controller层中设置对应的url,作为资源
@GetMapping("/reportform/find")public String findReportForm() {return "查询报表";}@GetMapping("/salary/find")public String findSalary() {return "查询工资";}@GetMapping("/staff/find")public String findStaff() {return "查询员工";}
示例
在配置类中修改如下
httpSecurity.authorizeHttpRequests(resp -> {resp.requestMatchers(new AntPathRequestMatcher("/login.html"), new AntPathRequestMatcher("/fail,html")).permitAll(); // 不需要认证的资源resp.requestMatchers(new AntPathRequestMatcher("/staff/find")).hasAnyAuthority("/staff/find");resp.anyRequest().authenticated();//其余所有请求都需要认证} );
以资源去匹配权限
资源过多时,用此方法,在访问资源时,判断用户是否具有访问此url的权限
在SecurityConfigure中进行修改
httpSecurity.authorizeHttpRequests(resp -> {resp.requestMatchers(new AntPathRequestMatcher("/login.html"), new AntPathRequestMatcher("/fail.html")).permitAll(); // 不需要认证的资源resp.requestMatchers(new AntPathRequestMatcher("/css/*.css"), new AntPathRequestMatcher("/js/*.js"), new AntPathRequestMatcher("/img/**")).permitAll(); // 静态资源不需要认证/*** access的参数是一个函数式接口* 方法的第一个参数代表认证对象,可以获取认证用户的权限集合* 方法的第二个参数代表网络环境,可以获取当前请求的路径*/resp.anyRequest().access((authentication, requestContext) -> {// 获取认证的用户权限Collection<? extends GrantedAuthority> authorities = authentication.get().getAuthorities();// 获取请求的URL路径String uri = requestContext.getRequest().getRequestURI();// 将URL路径封装为权限对象SimpleGrantedAuthority authority = new SimpleGrantedAuthority(uri);// 判断用户的权限集合是否包含请求的URL权限对象boolean result = authorities.contains(authority);return new AuthorizationDecision(result);});});
方法二、注解类设置访问控制(优选)
1. 需要在启动类中开启注解:@EnableMethodSecurity
package com.wunaiieq.tmp2024121105;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;@SpringBootApplication
@MapperScan("com.wunaiieq.tmp2024121105.mapper")
@EnableMethodSecurity
public class Tmp2024121105Application {public static void main(String[] args) {SpringApplication.run(Tmp2024121105Application.class, args);}}
2. controller对应的方法中增加注解
@GetMapping("/staff/find")@PreAuthorize("hasAnyAuthority('/staff/find')")public String findStaff() {return "查询员工";}
权限不足的处理方法
编写全写不足处理类,在权限不足时跳转指定页面,或弹窗等
权限不足的处理类
package com.wunaiieq.tmp2024121105.handler;import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {response.sendRedirect("/noPermission.html");}
}
配置文件中增加处理权限不足的异常
httpSecurity.exceptionHandling().accessDeniedHandler(new MyAccessDeniedHandler());
相关文章:
Spring Security授权案例集合
目录 授权前置内容权限表的设计建表和相关说明 用户权限配置内部关键类GrantedAuthority和SimpleGrantedAuthority关键类使用示例 资源访问控制方法一、配置类设置访问控制方法二、注解类设置访问控制(优选) 权限不足的处理方法 授权 前置内容 描述&am…...
自动化中关于文本的xpath定位
selenium中://*[text()内容] appium中://*[text热门] 如果是网页端元素,可以打开console,编写 $x("//div[1]") 判断自己写的xpath是否正确; 如果是appium,settings里面PLugins,下载XPathViewXS…...
数据结构 -- #栈和队列的定义和基本实现
文章目录 栈和队列的基本概念栈栈的顺序存储实现栈的链式存储实现(不带头结点) 队列队列的顺序存储实现队列的链式存储实现(带头结点)入队图解出队图解 总结 若没有相关知识基础,可以先看看下面文章哦🤗👇 线性表 栈和队列的基本概念 栈 栈…...
共享GitLab中CICD自动生成的软件包
0 Preface/Foreword 1 分享软件包地址 为了方便给接收对象方便下载固件,在下载固件时候,而无需打开网页,直接输入地址,弹出的对话框是将固件另存为。 或者进入CICD页面,找到job,在Download的标签上单击右键…...
JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测
JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…...
c# 协变与抗变
协变与抗变 1. 背景 一个简单的例子, public class Sharp {}public class Rectange : Sharp {}上面定义了两个简单的类,一个是图形类,一个是矩形类;它们之间有简单的继承关系:矩形是图形的一种。 接下来是常见的一种里氏替换写法: Sharp sharp = new Rectange();“子…...
Android Studio 创建虚拟设备的详细图文操作教程
本篇文章主要讲解 Android Studio 创建模拟器详细图文操作,包含了每一步的详细操作,便于理解和掌握对模拟的创建。 日期:2024年12月9日 作者:任聪聪 运行效果: 说明:创建运行后,点击右侧如下图…...
高级数据结构-树状数组
介绍 树状数组的推导 两个基础操作 模板-acwing795. 前缀和 #include<bits/stdc.h> using namespace std;const int N 1e610; int c[N]; int lowbit(int x){return x & -x; }int query(int x){int ans 0;for(; x; x - lowbit(x)) ans c[x];return ans; }void add…...
Android SDK 平台工具版本说明
Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具,主要是 adb 和 fastboot。虽然 adb 是 Android 应用开发所必需的,但应用开发者通常仅使用 Studio 安装的副本。如果您想直接从命令行使用 adb 并且未安装 S…...
【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
目录😋 任务描述 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现快速排序算法。 测试说明 平台会对你编写的代码进行测试: 测试输入示例: 10 6 8 7 9 0 1 3 2 4 5 (说明:第一行是元素个数&a…...
Vue项目打包部署到服务器
1. Vue项目打包部署到服务器 1.1. 配置 (1)修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }(2)检查router下的index.js文件下配置的mode模式。 检查如果模式改…...
写作词汇积累:差池、一体两面、切实可行极简理解
差池 【差池】可以是名词,是指意外的事或错误。 【差池】也可以是形容词,是指参差不齐、差劲或不行。 1. 由于操作不当,导致这次实验出现了【差池】,我们需要重新分析原因并调整方案。(名词,表示意外的事…...
【ubuntu18.04】ubuntu18.04安装EasyCwmp操作说明
参考链接 Tutorial – EasyCwmphttps://easycwmp.org/tutorial/ EasyCwmp 介绍 EasyCwmp 设计包括 2 个部分: EasyCwmp 核心:它包括 TR069 CWMP 引擎,负责与 ACS 服务器的通信。它是用 C 语言开发的。EasyCwmp DataModel:它包…...
C++ STL学习
首先声明:本文内容全部来自bilibili的【【C】算法竞赛常用 STL 用法】 https://www.bilibili.com/video/BV1L8411y7th/?share_sourcecopy_web&vd_source6548350a40ddeb68e9c477994f630bf0这个视频,在此对up主表示感谢,大家也可以直接去看…...
【源码+文档+调试讲解】校园零售商城微信小程序
摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括校园零售商城微信小程序的网络应用,在外国校园零售商城微信小程序已经是很普遍的方式,不过国内的校园零售商城微信小程序可能还处于起步阶段。校…...
BUUCTF Pwn bjdctf_2020_babystack2 题解
1.下载 checksec 64位 拖入IDA64 定位到main函数 以及后门函数 发现read需要读取输入——nbytes的数字来决定长度 同时nbytes是size_t类型 也就是无符号整型的 所以想到整数溢出漏洞 将nbytes设置为-1就会回绕,变成超大整数 从而实现栈溢出漏洞 exp:…...
【架构】从 Socket 的角度认识非阻塞模型
文章目录 前言1. 阻塞模型2. 非阻塞模型2.1 Reactor 模型优势2.2 Reactor 模型劣势 后记 前言 近期看了很多中间件的文章,RocketMQ,Dubbo 这些中间件内部的rpc通信都用的是非阻塞的模型。(Netty),这里从 Socket 的角度总结一下。 1. 阻塞模…...
PyTorch练习——张量的四则运算与矩阵运算
练习1: # 导入Torch库 import torch# 创建两个张量 x torch.tensor([1, 2, 3]) y torch.tensor([4, 5, 6])# 执行加法操作 z torch.add(x, y) print("加法结果:", z)# 执行减法操作 z torch.subtract(x, y) print("减法结果…...
验证码功能实现
预览: 前端代码 让图片src 产生验证码图片的servlet <img src""></img> servlet代码 public void checkCode(HttpServletRequest request, HttpServletResponse response) throws IOException {ServletOutputStream os response.getOutputStream()…...
uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能
前言 这次的标题有点长,主要是想要表述的功能点有点多; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分,可以单击预览大图,同时在预览界面可以双指放大缩小图片并且可以移动查看图片,双击放大࿰…...
MyBatisPlus-快速入门
Mybatis是持久层框架,主要用于数据库的增删改查。MybatisPlus是对Mybatis的增强,MybatisPlus并不是用于替代Mybatis的,两者之间是协作的关系。MybatisPlus 仅需进行简易配置,就能实现单表的 CRUD 操作。在日常开发中,单…...
【专题】2024年11月新能源汽车、智能汽车行业报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38520 随着科技的飞速发展与社会的持续变革,新能源汽车与智能汽车行业正步入全新的发展阶段,成为全球瞩目的焦点领域。本报告深入且全面地剖析了 2024 年 11 月该行业的多方面状况。从汽车消费市场来看&#…...
孚盟云 MailAjax.ashx SQL漏洞复现
0x01 产品描述: 孚盟云是由...
ABAP时间戳与日期时间转换及时区处理
一、时间戳转换为日期时间 1. 基本转换 CONVERT TIME STAMP <fs_back>-lastchangedatetime TIME ZONE sy-zonloINTO DATE DATA(lv_date)TIME DATA(lv_time).2. 解决8小时时差问题的方案 方案1:直接使用UTC时区(推荐) CONVERT TIME …...
Vue.js双向数据绑定原理详解
文章目录 前言一、什么是双向数据绑定?二、Vue.js实现双向数据绑定的机制三、v-model指令的工作原理四、案例研究:构建一个简单的双向绑定应用五、最佳实践与注意事项结语 前言 Vue.js是一款流行的渐进式JavaScript框架,它以简洁的API和强大…...
torch.clamp函数详解以及clamp_函数:中英双语
中文版 torch.clamp 函数详解 在 PyTorch 中,torch.clamp 是一个非常实用的函数,主要用于对张量中的元素进行截断(clamping),将其限制在一个指定的区间范围内。 函数定义 torch.clamp(input, minNone, maxNone) →…...
前端WebSocket应用——聊天实时通信的基本配置
使用 WebSocket 实现实时通信的 Vue 应用 前言1. WebSocketService 类 1.1 类属性1.2 构造函数和连接初始化1.3 WebSocket 连接1.4 事件处理方法1.5 发送和关闭 WebSocket 消息1.6 状态查询与回调注册1.7 完整代码 2. 在 Vue 组件中使用 WebSocketService 2.1 定义 WebSocket …...
OpenCV相机标定与3D重建(18)根据基础矩阵(Fundamental Matrix)校正两组匹配点函数correctMatches()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 优化对应点的坐标。 cv::correctMatches 是 OpenCV 库中的一个函数,用于根据基础矩阵(Fundamental Matrix)校…...
【Linux】Linux的基本常识+指令
目录 1. 整体学习思维导图 2. 常见快捷键操作 3. 基本指令 pwd指令 whoami指令 ls 指令 touch指令 cd 指令 Stat 指令 mkdir 指令 alias指令 nano 指令 rmdir 和 rm 指令 man 指令手册 cp 命令 cat/echo/tac 指令 mv 指令 less 指令 head/tail 指令 date…...
永恒之蓝漏洞利用什么端口
永恒之蓝(EternalBlue)是一个著名的漏洞,影响了 Windows 操作系统的 SMBv1 服务。它的漏洞编号是 CVE-2017-0144,该漏洞被用于 WannaCry 等勒索病毒的传播。 永恒之蓝漏洞利用的端口 永恒之蓝漏洞利用的是 SMB(Server…...
Shell浅浅谈(九) 玩转 test 命令
test 命令用于检查某个条件是否成立,可以用于数值、字符和文件测试,并且支持逻辑操作符,以下是对test的总结: 数值测试 用于比较两个数值,支持以下操作符: -eq:等于则为真-ne:不等…...
LoRA:低秩分解微调与代码
传统的微调,即微调全量参数,就是上面的公式,但是我们可以通过两个矩阵,来模拟这个全量的矩阵,如果原来的W是(N * N)维度,我们可以通过两个(N * R) 和 (R * N)的矩阵矩阵乘,来模拟微调的结果。 …...
电子商务人工智能指南 5/6 - 丰富的产品数据
介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...
27.攻防世界simple_js
进入场景 输个123456 抓包,有一个解密过程 其实不用抓包,源代码也能得到此页面 \x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30 将pass替换成55,…...
RabbitMQ 基本使用方法详解
RabbitMQ 基本使用方法 在你的代码中,涉及到了 RabbitMQ 的基本使用,包括队列定义、交换机的配置、消息的发送与接收等内容。下面我将详细总结 RabbitMQ 的基本使用方法,重点解释如何在 Spring Boot 项目中与 RabbitMQ 集成。 1. 引入依赖 …...
设计模式学习之——工厂模式
设计模式中的工厂模式主要分为三种:简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。 下面是对这三种工厂模式的详细…...
分布式专题(4)之MongoDB快速实战与基本原理
一、MongoDB介绍 1.1 什么是MongoDB MongoDB是一个文档数据库(以JSON为数据模型),由C语言编写,旨在为WEB应用提供可扩展的高性能存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富…...
什么是MAC地址?什么是IP地址?IP地址与MAC地址是什么关系?
MAC地址是指Media Access Control Address,媒体访问控制地址。MAC地址被烧录在网络设备的ROM之内, IP地址类似于门牌号码,有了门牌号码,邮差才知道把邮件投送到哪里。 有人新建房屋了,就会分配新的门牌号码(…...
FireFox火狐浏览器企业策略禁止更新
一直在用火狐浏览器,但是经常提示更新,进入浏览器右上角就弹出提示,比较烦。多方寻找,一直没有找到合适的方案,毕竟官方没有给出禁用检查更新的选项,甚至about:config里都没有。 最终找到了通过企业策略控…...
C++中面向对象编程如何实现数据隐藏?
概念 在 C 中,面向对象编程(OOP)中的数据隐藏是指将对象的内部数据(成员变量)保护起来,只允许通过特定的公共接口(方法)去访问和修改这些数据。这种做法可以确保对象的状态保持一致…...
使用 rbenv 切换 Ruby 版本
1. 查看当前 Ruby 版本 首先,查看当前系统中安装的 Ruby 版本: ruby -v如果你已经安装了 rbenv,可以列出通过 rbenv 安装的 Ruby 版本: rbenv versions2. 安装 Ruby 版本 如果你想安装新的 Ruby 版本,使用以下命令…...
6.4 CPU性能分析--Intel处理器跟踪技术
Intel处理器跟踪PT技术是记录程序执行过程的技术,它把记录信息编码报文存到高压缩率的二进制文件中。该二进制文件结合每条指令的时间戳重建执行流。PT技术覆盖度大,开销小,有关开销的信息详见,主要用于性能问题的事后分析和根因定…...
智能设备安全-固件逆向分析
固件逆向分析实验报告-20241022 使用固件常用逆向分析工具,对提供的固件进行文件系统提取,并记录逆向分析实验过程,提交实验报告(报告要求图文并茂,对涉及到的关键步骤附截图说明)。具体任务如下࿱…...
Elasticsearch Java Api Client中DSL语句的查询方法汇总(二)
接上一篇:《Elasticsearch Java Api Client中DSL语句的查询方法汇总》 说明:示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。 1、ScriptQuery方法 用途:它允许用户使用脚本(通常是 Painless 脚本语言…...
xshell连接虚拟机,更换网络模式:NAT->桥接模式
NAT模式:虚拟机通过宿主机的网络访问外网。优点在于不需要手动配置IP地址和子网掩码,只要宿主机能够访问网络,虚拟机也能够访问。对外部网络而言,它看到的是宿主机的IP地址,而不是虚拟机的IP。但是,宿主机可…...
【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)
问题描述 根据操作手册正常拉取代码,然后编译OpenHarmony5.0.0版本rk3568项目 编译命令 ./build.sh --product-name rk3568 --ccache出现如下报错 然后真正开始出错的位置是下面这句log FAILED: ../kernel/src_tmp/linux-5.10/boot_linux ../kernel/checkpoint/c…...
线上维修记录查询,让车辆保养更省心!
车辆保养对于每一位车主来说都是一个必不可少的环节,它不仅可以延长车辆的使用寿命,还能提高行车安全性。然而,相信很多人都有这样的经历:不知道自己的车辆什么时候进行过维修,也不清楚维修的内容和费用。这样一来&…...
【机器学习】基础知识:拟合度(Goodness of Fit)
拟合度概念及意义 拟合度(Goodness of Fit)是衡量统计模型对数据解释能力的指标,用于评价模型对观测数据的拟合效果。在回归分析、分类模型或其他预测模型中,拟合度是模型性能的重要衡量标准。 1. 拟合度的作用 拟合度的主要作用…...
排序算法(2)——快速排序
目录 1. 实现方式 1.1 霍尔法 1.2 挖坑法 1.3 前后指针法 2. 时间复杂度分析 3. 快速排序优化 3.1 三数取中 3.2 小区间使用插入排序 3.3 非递归实现 快速排序是英国计算机科学家托尼・霍尔(C. A. R. Hoare)在 1960 年年提出的一种二叉树结构…...
测试招工组,解决三个问题
所以我们今天的目标-----找工作! 那么我要找什么工作?如何能胜任这份工作?怎么让单位选择我?这是我们面临的三个问题。 一、我要找什么样的工作 解决这个问题,可以根据你当下已经掌握的能力,和毕业及工作…...