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

OAuth 2.0

简介

OAuth 是一种开放标准的授权协议或框架,它提供了一种安全的方式,使第三方应用程序能够访问用户在其他服务上的受保护资源,而无需共享用户的凭证(如用户名和密码)。OAuth 的核心思想是通过“授权令牌”来代替直接使用用户名和密码进行身份验证。OAuth 不是属于任何一家公司的产品或服务。OAuth 是一个开放标准的授权框架,它由互联网工程任务组(IETF)定义,并通过社区贡献不断发展和完善。
OAuth 的开发和维护是由多个组织和个人共同参与的,不是由单一公司控制或拥有的。因此,它被广泛应用于各种互联网服务中,包括但不限于Google、Facebook、Twitter、Microsoft等大公司提供的服务。这些公司实现了OAuth协议来支持第三方应用的安全授权流程。
OAuth 名字里面的O代表Open,名字里的Auth是 “Authentication”(身份验证)或 “Authorization”(授权)的缩写。OAuth 的全称可以理解为 Open Authorization 或 Open Authentication,
主要特点

  • 安全性:避免了直接暴露用户的敏感信息,减少了潜在的安全风险。
  • 灵活性:支持多种授权模式,适用于不同的应用场景。
  • 广泛适用性:被众多互联网服务提供商采用,如WeiChat、Google、Facebook、Twitter等。

OAuth 1.0 和 OAuth 2.0 的区别

OAuth 1.0 和 OAuth 2.0 是两种不同的授权协议版本,虽然它们的目标都是为了安全地授权第三方应用访问用户资源,但在设计和实现上有显著差异。以下是两者的主要区别:

  1.  签名机制
    - OAuth 1.0:
      - 使用复杂的签名算法(如 HMAC-SHA1 或 RSA-SHA1)对每个请求进行签名。
      - 需要在每次请求中包含签名参数,增加了开发和调试的复杂性。
    - OAuth 2.0:
      - 不再强制要求对每个请求进行签名,而是依赖于传输层安全(TLS/SSL)来保护通信。
      - 简化了客户端的实现,减少了出错的可能性。
  2. 授权类型
    - OAuth 1.0:
      - 主要支持“三腿”(Three-legged)授权流程,即涉及客户端、用户和授权服务器。
    - OAuth 2.0:
      - 支持多种授权类型,包括但不限于:
        - 授权码模式(Authorization Code):适用于Web应用程序。
        - 隐式模式(Implicit):适用于浏览器或移动应用等无法安全存储密钥的客户端。
        - 密码模式(Resource Owner Password Credentials):适用于信任度高的客户端。
        - 客户端凭证模式(Client Credentials):适用于客户端直接访问资源而无需用户参与的场景。
  3. 令牌类型
    - OAuth 1.0:
      - 使用临时令牌(Request Token)和访问令牌(Access Token),需要额外的步骤来交换临时令牌为访问令牌。
      
    - OAuth 2.0:
      - 直接使用访问令牌(Access Token),简化了流程。
      - 引入了刷新令牌(Refresh Token),允许在访问令牌过期后获取新的访问令牌,而不需要再次让用户授权。
  4. 安全性
    - OAuth 1.0:
      - 依赖于签名机制来确保请求的完整性和真实性,但签名算法复杂且容易出错。
      
    - OAuth 2.0:
      - 更加依赖于HTTPS/TLS来保证通信的安全性,简化了安全配置。
      - 提供了更灵活的安全选项,例如通过短寿命的访问令牌和刷新令牌来增强安全性。
  5. 易用性和灵活性
    - OAuth 1.0:
      - 实现较为复杂,尤其是签名算法的处理,增加了开发和维护成本。
      
    - OAuth 2.0:
      - 设计更加简洁,易于实现和集成。
      - 提供了更多的灵活性,适用于各种类型的客户端和应用场景。
  6. 社区和支持
    - OAuth 1.0:
      - 已经逐渐被弃用,社区支持较少。
      
    - OAuth 2.0:
      - 广泛采用,拥有活跃的社区和丰富的文档及工具支持。

 总结
OAuth 2.0 在多个方面进行了改进,简化了授权流程,增强了灵活性,并依赖现代的安全措施(如TLS)。因此,OAuth 2.0 成为了当前最常用的授权协议版本,广泛应用于各种Web和移动应用中。

OAuth 2.0 的主要角色

  •  资源所有者(Resource Owner):通常是用户,拥有受保护资源的人。
  • 客户端(Client):希望访问受保护资源的应用程序,或三方应用程序。
  • 授权服务器(Authorization Server):负责颁发访问令牌。
  • 资源服务器(Resource Server):存储受保护资源并根据访问令牌提供资源。 

OAuth 2.0授权时序图

OAuth 2.0的授权与身份验证

 1. 授权(Authorization)

 OAuth 2.0 提供了多种授权模式(Grant Types),每种模式适用于不同的应用场景。以下是常见的授权模式及其技术实现:

 1.1 授权码模式(Authorization Code Grant)

- 适用场景:Web应用、移动应用等需要高安全性且能够安全存储客户端密钥的应用。
- 技术实现:
  - 重定向URI(redirect_uri):用户授权后,授权服务器将用户重定向到指定的URL,并附带授权码。
  - 授权码(Authorization Code):临时代码,用于换取访问令牌。
  - 客户端凭证(Client Credentials):客户端ID和客户端密钥,用于验证客户端身份。
  - TLS/SSL:确保通信的安全性。

 1.2 隐式模式(Implicit Grant)

- 适用场景:浏览器应用、单页应用(SPA)等无法安全存储客户端密钥的应用。
- 技术实现:
  - 重定向URI(redirect_uri):用户授权后,授权服务器直接将访问令牌附加到重定向URI的片段标识符中。
  - 访问令牌(Access Token):直接返回给客户端应用,无需额外步骤。
  - TLS/SSL:确保通信的安全性。

 1.3 密码模式(Resource Owner Password Credentials Grant)

- 适用场景:信任度高的客户端应用,如第一方应用。
- 技术实现:
  - 用户名和密码:用户直接提供凭证给客户端应用。
  - 客户端凭证(Client Credentials):客户端ID和客户端密钥,用于验证客户端身份。
  - TLS/SSL:确保通信的安全性。

 1.4 客户端凭证模式(Client Credentials Grant)

- 适用场景:客户端直接访问资源而无需用户参与的场景,如服务到服务通信。
- 技术实现:
  - 客户端凭证(Client Credentials):客户端ID和客户端密钥,用于验证客户端身份。
  - TLS/SSL:确保通信的安全性。

同时如果当访问令牌过期时,客户端可以使用刷新令牌来请求新的访问令牌,而不需要用户重新进行身份验证。

2. 验证(Authentication and Validation)

 2.1 访问令牌验证(Access Token Validation)

- JWT格式的访问令牌:
  - 签名验证:使用公钥或对称密钥验证JWT的签名,确保令牌未被篡改。
  - 过期时间检查:验证'exp'(过期时间)声明,确保令牌仍在有效期内。
  - 受众检查:验证'aud'(受众)声明,确保令牌是发给当前应用的。
  - 签发者检查:验证'iss'(签发者)声明,确保令牌来自可信的授权服务器。

- 不透明的访问令牌:
  -  introspection 端点:通过调用授权服务器的'/token/introspect'端点,验证令牌的有效性和其他属性。

 2.2 ID Token 验证(仅限OpenID Connect)

- 签名验证:使用公钥或对称密钥验证JWT的签名,确保ID Token未被篡改。
- 过期时间检查:验证'exp'(过期时间)声明,确保ID Token仍在有效期内。
- 受众检查:验证'aud'(受众)声明,确保ID Token是发给当前应用的。
- 签发者检查:验证'iss'(签发者)声明,确保ID Token来自可信的授权服务器。
- nonce检查:验证'nonce'声明,确保ID Token与原始授权请求中的'nonce'参数匹配,防止重放攻击。
- at_hash检查:如果同时使用了访问令牌,验证'at_hash'声明以确保访问令牌和ID Token的一致性。

使用Spring搭建OAuth 2.0 服务

1.创建Spring项目

2. 添加OAuth2 依赖

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- Spring Security OAuth2 Authorization Server --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-authorization-server</artifactId><version>0.2.3</version> <!-- 请使用最新版本 --></dependency><!-- Spring Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- H2 Database --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!-- Spring Boot DevTools --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- Spring Boot Starter Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

3. 配置数据库

spring:datasource:url: jdbc:h2:mem:testdbdriver-class-name: org.h2.Driverusername: sapassword:h2:console:enabled: truepath: /h2-consolejpa:hibernate:ddl-auto: updateshow-sql: trueproperties:hibernate:format_sql: true

 4. 配置Spring Security

 创建一个配置类来设置Spring Security,包括用户认证和授权服务器配置。

4.1. 创建用户实体和仓库

首先,创建一个简单的用户实体和JPA仓库。
User.java  

package com.example.oauth2server.model;import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;import javax.persistence.*;
import java.util.Collection;
import java.util.List;@Entity
@Data
public class User implements UserDetails {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return List.of(new SimpleGrantedAuthority("ROLE_USER"));}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}

UserRepository.java

package com.example.oauth2server.repository;import com.example.oauth2server.model.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {User findByUsername(String username);
}
4.2. 配置用户认证

创建一个配置类来设置用户认证。
SecurityConfig.java 

package com.example.oauth2server.config;import com.example.oauth2server.model.User;
import com.example.oauth2server.repository.UserRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;@Configuration
public class SecurityConfig {private final UserRepository userRepository;public SecurityConfig(UserRepository userRepository) {this.userRepository = userRepository;}@Beanpublic UserDetailsService userDetailsService() {return username -> userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found"));}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}
 4.3. 配置授权服务器

创建一个配置类来设置授权服务器。
AuthorizationServerConfig.java

package com.example.oauth2server.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore;@Configuration
@EnableAuthorizationServer
@Order(1)
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {private final PasswordEncoder passwordEncoder;public AuthorizationServerConfig(PasswordEncoder passwordEncoder) {this.passwordEncoder = passwordEncoder;}@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.tokenStore(tokenStore());}@Beanpublic TokenStore tokenStore() {return new InMemoryTokenStore();}@Overridepublic void configure(org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("client").secret(passwordEncoder.encode("secret")).authorizedGrantTypes("authorization_code", "refresh_token", "password").scopes("read", "write").redirectUris("http://localhost:8080/callback").accessTokenValiditySeconds(3600).refreshTokenValiditySeconds(2592000);}
}
4.4. 配置资源服务器

 创建一个配置类来设置资源服务器。
ResourceServerConfig.java

package com.example.oauth2server.config;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/oauth/**").permitAll().anyRequest().authenticated();}
}
4.5. 创建控制器
package com.example.oauth2server.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/getAuth")public String hello() {return xxxx.xxx();}
}
 4.6. 初始化数据
package com.example.oauth2server.config;import com.example.oauth2server.model.User;
import com.example.oauth2server.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
public class DataLoader {@Autowiredprivate UserRepository userRepository;@Autowiredprivate PasswordEncoder passwordEncoder;@Beanpublic CommandLineRunner dataLoader() {return args -> {if (userRepository.findByUsername("user") == null) {User user = new User();user.setUsername("user");user.setPassword(passwordEncoder.encode("password"));userRepository.save(user);}};}
}

相关文章:

OAuth 2.0

简介 OAuth 是一种开放标准的授权协议或框架&#xff0c;它提供了一种安全的方式&#xff0c;使第三方应用程序能够访问用户在其他服务上的受保护资源&#xff0c;而无需共享用户的凭证&#xff08;如用户名和密码&#xff09;。OAuth 的核心思想是通过“授权令牌”来代替直接…...

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题&#xff08;选择题&#xff09; 题目总数&#xff1a;5 总分数&#xff1a;50 选择题 第 1 题 单选题 Scratch运行以下程宇后&#xff0c;小兔子会&#xff08; &#xff09;。 A. 变小 B. 变大 C. 变色 D. …...

pat乙级1072 开学寄语

下图是上海某校的新学期开学寄语&#xff1a;天将降大任于斯人也&#xff0c;必先删其微博&#xff0c;卸其 QQ&#xff0c;封其电脑&#xff0c;夺其手机&#xff0c;收其 ipad&#xff0c;断其 wifi&#xff0c;使其百无聊赖&#xff0c;然后&#xff0c;净面、理发、整衣&am…...

【Linux系统编程】:信号(2)——信号的产生

1.前言 我们会讲解五种信号产生的方式: 通过终端按键产生信号&#xff0c;比如键盘上的CtrlC。kill命令。本质上是调用kill()调用函数接口产生信号硬件异常产生信号软件条件产生信号 前两种在前一篇文章中做了介绍&#xff0c;本文介绍下面三种. 2. 调用函数产生信号 2.1 k…...

Qwen2.5-7B 微调rz吧数据集

Qwen2.5-7B 微调弱智吧数据集 模型微调简介 模型微调是一种在已有预训练模型的基础上&#xff0c;通过使用特定任务的数据集进行进一步训练的技术。这种方法允许模型在保持其在大规模数据集上学到的通用知识的同时&#xff0c;适应特定任务的细微差别。使用微调模型&#xff…...

未来将要被淘汰的编程语言

COBOL - 这是一种非常古老的语言&#xff0c;主要用于大型企业系统和政府机构。随着老一代IT工作人员的退休&#xff0c;COBOL程序员变得越来越少。Fortran - 最初用于科学和工程计算&#xff0c;Fortran在特定领域仍然有其应用&#xff0c;但随着更现代的语言&#xff08;如Py…...

翻转(蓝桥杯2023大学C组试题E)

【问题描述】&#xff1a;小蓝用黑白棋的n个棋子排成了一行&#xff0c;他在脑海里想象出了一个长度为n的01串T&#xff0c;他发现如果把黑棋当作1、白棋当做0&#xff0c;这一行棋子是一个长度为n的01串S。 小蓝如果在S中发现一颗棋子和它两边的棋子都不一样&#xff0c;可以将…...

期权VIX指数构建与择时应用

芝加哥期权交易 所CBOE的波动率指数VIX 是反映 S&P 500 指数未来 30 天预测期波动率的指标&#xff0c;由于预期波动率多用于表征市场情绪&#xff0c;因此 VIX 也被称为“ 恐慌指数”。 VIX指数计算 VIX 反映了市场情绪和投资者的风险偏好&#xff0c; 对于欧美市场而言…...

Nginx界的天花板-Oracle 中间件OHS 11g服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; 服务器IP DNS F5配置 OHS1 172.xx.xx.xx ohs01.xxxxxx.com ohs.xxxxxx.com OHS2 172.xx.xx.xx ohs02.xxxxxx.com 服务器用户角色信息均为&#xff1a;…...

torch.unsqueeze:灵活调整张量维度的利器

在深度学习框架PyTorch中&#xff0c;张量&#xff08;Tensor&#xff09;是最基本的数据结构&#xff0c;它类似于NumPy中的数组&#xff0c;但可以在GPU上运行。在日常的深度学习编程中&#xff0c;我们经常需要调整张量的维度以适应不同的操作和层。torch.unsqueeze函数就是…...

为什么使用环形队列

1.看以下两种情况。第一种不会出现问题&#xff0c;当主流程读取次数比较慢时&#xff0c;数据会被覆盖。 2.扩大空间。不可取。 3.什么是队列...

Qt之QML应用程序开发:给应用程序添加图标文件

开发环境: 1、Qt Creator 14.0.1 2、windows10 先看下面的步骤,不明白再返回来看下面官方指导链接。 先看下面的步骤,不明白再返回来看下面官方指导链接。 先看下面的步骤,不明白再返回来看下面官方指导链接。 --------------------------------------------------------…...

基于xiaothink对Wanyv-50M模型进行c-eval评估

使用pypi安装xiaothink&#xff1a; pip install xiaothink1.0.2下载模型&#xff1a; 万语-50M 开始评估(修改模型路径后即可直接开始运行&#xff0c;结果保存在output文件夹里)&#xff1a; import os import json import pandas as pd import re from tqdm import tqdm i…...

大模型项目如何成功落地?

随着人工智能的快速发展&#xff0c;大模型已经成为企业转型和提升效率的关键工具。要让大模型成功落地&#xff0c;需要几个关键要素&#xff0c;以及明白如何组建一个高效的团队。 首先&#xff0c;成功的关键在于业务人员的积极参与&#xff0c;这是项目成功的起点。 其次…...

重构(二)

继续"提高代码质量" 接着上文提高代码质量, 需要从这几个特点入手 1、代码重用性。2、可读性。3、可扩展性。4、可靠性。5、高内聚&#xff0c;低耦合。 仅仅就"可读性"去分析一下吧, 毕竟例子实在是太多了 递归的"可读性"不如while循环 递归…...

Sapro编程软件

Sapro软件是由西门子建筑科技公司开发的一款编程软件&#xff0c;主要用于Climatix控制器的编程、调试及相关功能实现.以下是其具体介绍&#xff1a; • 功能强大&#xff1a;可进行HVAC控制编程&#xff0c;实现设备控制、HMI用户访问和设备集成等功能&#xff0c;满足复杂的…...

EasyGBS国标GB28181公网平台P2P远程访问故障诊断:云端服务端排查指南

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。EasyGBS平台&#xff0c;作为基于国标GB28181协议的视频流媒体平台&#xff0c;为用户提供了强大的视频监控直播功能。然而&#xff0c;在实际应用中&#xff0c;P2P远程访问可…...

学生管理系统,增加教师管理,班级管理,角色功能权限管理

为了在现有的学生管理系统中增加**教师管理**、**班级管理**以及**角色和权限管理**&#xff0c;我们需要对数据库进行扩展&#xff0c;并相应地更新 Python 代码和用户界面。以下是详细的步骤和代码示例。 ## 1. 数据库扩展 ### 1.1 创建新表 #### 教师表 (teachers) sql …...

Vue CLI 脚手架创建项目流程详解 (2)

更新 CLI 脚手架 确保你安装的是最新版本的 Vue CLI&#xff0c;以支持最新的特性及改进。你可以通过以下命令全局安装或更新 Vue CLI&#xff1a; npm install -g vue/cli创建 Vue 3.x 项目 启动创建向导 使用 vue create 命令来开始创建一个新的 Vue 项目&#xff1a; vue …...

LabVIEW机械故障诊断中的传感器选择

在机械设备故障诊断中&#xff0c;传感器是关键设备&#xff0c;用于采集设备运行状态的各种数据。常见的传感器类型和选择方法如下&#xff1a; 1. 振动传感器 用于检测设备运行中的振动特征&#xff0c;常见于旋转机械和轴承故障诊断。 加速度传感器&#xff1a;检测高频振…...

二叉树_堆

目录 一. 树(非线性结构&#xff09; 1.1 树的概念与结构 1.2 树的表示 二. 二叉树 2.1 二叉树的概念与结构 2.2 特殊的二叉树 2.3 二叉树的存储结构 三. 实现顺序结构的二叉树 3.1 堆的概念与结构 一. 树(非线性结构&#xff09; 1.1 树的概念与结构 概念&#xff…...

Java图片拼接

最近遇到一个挺离谱的功能&#xff0c;某个表单只让上传一张图&#xff0c;多图上传会使导出失败。跟开发沟通后表示&#xff0c;这个问题处理不了。我... 遂自己思考&#xff0c;能否以曲线救国的方式拯救一下&#xff0c;即不伤及代码之根本&#xff0c;又能解决燃眉之急。灵…...

使用qemu搭建armv7嵌入式开发环境

目录 目录 1 概述 2 环境准备 2.1 vexpress系列开发板介绍 2.2 安装工具 2.2.1 安装交叉工具链 2.2.2 安装qemu 2.2.3 安装其他工具 3 启动uboot 3.1 uboot下载与编译 3.1.1 下载 3.1.2 编译 3.2 使用qemu启动uboot 4 启动kernel 4.1 下载和编译kernel 4.1.1 下…...

新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github

经过近3个月的迭代开发&#xff0c;新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了&#xff0c;最新的EasyGBD支持了国标GB28181-2022版&#xff0c;还支持了语音对讲、位置上报、本地录像等功能&#xff0c;比原有GB28181-2016版的EasyGBD更加高效、…...

Hashtable 描述及源码解析

目录 一、Hashtable的基本概念 二、Hashtable的源码解析 构造函数 哈希算法函数 处理哈希冲突 类定义和成员变量 构造方法 插入元素 查找元素 删除元素 扩容 Hashtable&#xff08;哈希表&#xff09;是一种非常重要的数据结构&#xff0c;它提供了快速的数据插入、删…...

clickhouse-数据库引擎

1、数据库引擎和表引擎 数据库引擎默认是Ordinary&#xff0c;在这种数据库下面的表可以是任意类型引擎。 生产环境中常用的表引擎是MergeTree系列&#xff0c;也是官方主推的引擎。 MergeTree是基础引擎&#xff0c;有主键索引、数据分区、数据副本、数据采样、删除和修改等功…...

深度学习之超分辨率算法——SRCNN

网络为基础卷积层 tensorflow 1.14 scipy 1.2.1 numpy 1.16 大概意思就是针对数据&#xff0c;我们先把图片按缩小因子照整数倍进行缩减为小图片&#xff0c;再针对小图片进行插值算法&#xff0c;获得还原后的低分辨率的图片作为标签。 main.py 配置文件 from model im…...

本机如何连接虚拟机MYSQL

要让本机&#xff08;主机&#xff09;连接到虚拟机上的 MySQL 数据库&#xff0c;你需要确保虚拟机和主机之间的网络连接正常&#xff0c;并且 MySQL 配置允许外部连接。以下是实现本机连接虚拟机 MySQL 的步骤&#xff1a; 步骤 1&#xff1a;确认虚拟机与本机的网络连接 确…...

mac 安装graalvm

Download GraalVM 上面链接选择jdk的版本 以及系统的环境下载graalvm的tar包 解压tar包 tar -xzf graalvm-jdk-<version>_macos-<architecture>.tar.gz 移入java的文件夹目录 sudo mv graalvm-jdk-<version> /Library/Java/JavaVirtualMachines 设置环境变…...

大模型日报 2024-12-19

大模型日报 2024-12-19 大模型资讯 标题&#xff1a;OpenAI发布季第十天&#xff1a;ChatGPT登陆电话、WhatsApp&#xff0c;你可以给ChatGPT真正打电话了 摘要&#xff1a;OpenAI于2024年12月18日发布了ChatGPT的新功能&#xff0c;用户可以通过电话和WhatsApp与ChatGPT进行互…...

【数据结构练习题】链表与LinkedList

顺序表与链表LinkedList 选择题链表面试题1. 删除链表中等于给定值 val 的所有节点。2. 反转一个单链表。3. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。4. 输入一个链表&#xff0c;输出该链…...

使用 acme.sh 申请域名 SSL/TLS 证书完整指南

使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL&#xff1f;前置要求安装过程 步骤一&#xff1a;安装 acme.sh步骤二&#xff1a;配置 ZeroSSL 证书申请 方法一&#xff1a;手动 DNS 验证&#xff08;推荐新手使用&#xff09;方法二&#xf…...

微信小程序开发入门

实现滚动 需要设置高度和边框 轮播图 差值表达式&#xff08; {{表达式的值}} &#xff09;,info数据要写到js文件的data数据中 小程序中常用的事件...

【LeetCode】9、回文数

【LeetCode】9、回文数 文章目录 一、数学: 除法和取模1.1 数学: 除法和取模 二、多语言解法 一、数学: 除法和取模 1.1 数学: 除法和取模 例如 15251, offset 也是五位数的 10000 先判断首1和尾1, 再变为 525, offset 变为 100 再判断首5和尾5, 再变为 2, offset 变为 1 整个…...

面试题整理9----谈谈对k8s的理解2

面试题整理9----谈谈对k8s的理解2 1. Service 资源1.1 ServiceClusterIPNodePortLoadBalancerIngressExternalName 1.2 Endpoints1.3 Ingress1.4 EndpointSlice1.5 IngressClass 2. 配置和存储资源2.1 ConfigMap2.2 Secret2.3 PersistentVolume2.4 PersistentVolumeClaim2.5 St…...

fpga系列 HDL:Quartus II PLL (Phase-Locked Loop) IP核 (Quartus II 18.0)

在 Quartus II 中使用 PLL (Phase-Locked Loop) 模块来将输入时钟分频或倍频&#xff0c;并生成多个相位偏移或频率不同的时钟信号&#xff1a; 1. 生成 PLL 模块 在 Quartus II 中&#xff1a; 打开 IP Components。 file:///C:/intelFPGA_lite/18.0/quartus/common/help/w…...

中国量子计算机领域的发展现状与展望

中国量子计算机领域的发展现状与展望 摘要 随着全球科技竞争的加剧&#xff0c;量子计算作为前沿技术领域备受瞩目。中国在量子计算机的研发方面取得了显著进展&#xff0c;本文将深入探讨中国量子计算机领域的现状、取得的成果、面临的挑战以及未来的发展方向&#xff0c;并…...

html(超文本标记语言)

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…...

如何在Windows系统上安装和配置Maven

Maven是一个强大的构建和项目管理工具&#xff0c;广泛应用于Java项目的自动化构建、依赖管理、项目构建生命周期控制等方面。在Windows系统上安装Maven并配置环境变量&#xff0c;是开发者开始使用Maven的第一步。本文将详细介绍如何在Windows系统上安装和配置Maven&#xff0…...

基于Python Scrapy的豆瓣Top250电影爬虫程序

Scrapy安装 Python实现一个简单的爬虫程序&#xff08;爬取图片&#xff09;_python简单扒图脚本-CSDN博客 创建爬虫项目 创建爬虫项目&#xff1a; scrapy startproject test_spider 创建爬虫程序文件&#xff1a; >cd test_spider\test_spider\spiders >scrapy g…...

mysql,数据库数据备份

mysql 一.数据库备份概念1.备份分类2.备份策略3.备份三要素二.完全备份操作1.物理备份(还原),冷备份2.逻辑备份,温备份三.percona软件的xtrabackup工具备份(2备份,3还原),增量,差异1.percona软件安装2.增量备份(还原)3.差异备份四.binlog日志1.binlog日志概念2.查看binlog日志信…...

模仿elementui的Table,实现思路

vue2子组件使用render&#xff0c;给子子组件插槽传值 和elementui的Table一样使用render 在 Vue 2 中&#xff0c;子组件使用render函数向子子组件插槽传值可以通过以下步骤实现&#xff1a; 1、创建子组件 首先创建一个子组件&#xff0c;在子组件中使用render函数来渲染内容…...

Android Studio AI助手---Gemini

从金丝雀频道下载最新版 Android Studio&#xff0c;以利用所有这些新功能&#xff0c;并继续阅读以了解新增内容。 Gemini 现在可以编写、重构和记录 Android 代码 Gemini 不仅仅是提供指导。它可以编辑您的代码&#xff0c;帮助您快速从原型转向实现&#xff0c;实现常见的…...

大模型+安全实践之春天何时到来?

引子:距《在大模型实践旅途中摸了下上帝的脚指头》一文发布近一年,2024年笔者继续全情投入在大模型+安全上,深度参与了一些应用实践,包括安全大模型首次大规模应用在国家级攻防演习、部分项目的POC直到项目落地,也推动了一些场景安全大模型应用从0到3的孵化上市。这一年也…...

ACL技术---访问控制列表

是一种策略。 对于网络中的流量而言&#xff0c;通常有两种处理方式 允许 拒绝 ACL 的原理 配置了 ACL 的网络设备会根据事先设定好的报文匹配规则对经过该设备的报文进行匹配&#xff0c;然后对报 文执行预先设定好的处理动作。 ACL 的功能 访问控制&#xff1a;在设备…...

第25周:文献阅读

目录 摘要 Abstract 文献阅读 现有问题 提出方法 创新点 方法论 实验研究 数据集 数据预处理 仿真实验 评价指标 实验结果分析 总结 摘要 本篇论文提出了一种基于深度学习框架的风速预测方法——SSA-BiLSTM网络&#xff0c;旨在提高风速预测的精确性。研究使…...

BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出)

Matlab实现BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测&#xff08;多输入单输出&#xff09; 目录 Matlab实现BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测&#xff08;多输入单输出&#xff09;分类效果基本描述…...

docker数据卷

什么是数据卷&#xff1f; 在容器中是无法通过vi命令对一个容器中的资源做修改的&#xff0c;这个时候就需要通过数据卷将文件中的内容映射到宿主机&#xff0c;在宿主机修改的文件会更新到容器中&#xff0c;并且容器被删除后不会把数据卷删除&#xff0c;数据卷中的数据会被持…...

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-信号量【入门三】

继续上一篇任务创建 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】-CSDN博客】 今天要实现再创建一个任务。【二值和互斥都进行测试】 ①、通过任务A发送一个信号量&#xff0c;另一个任务得到信号量后再发送helloworld。 ②、两个任务通过互斥信…...

使用C#绘制具有平滑阴影颜色的曼德布洛特集分形

示例使用复数类在 C# 中轻松绘制曼德布洛特集分形解释了如何通过迭代方程绘制曼德布洛特集:...