登录校验组件 Spring Security OAuth2 详解

news2024/12/23 17:25:32

什么是OAuth?

OAuth(全称Open Authorization,开放授权)是一种基于令牌的身份验证和授权协议,它允许用户授权第三方应用访问其在服务提供者(如社交媒体、邮箱服务等)上存储的特定信息,而无需直接向第三方应用提供其用户名和密码。OAuth的主要目的是提供一种安全、开放且简单的标准,以促进跨第三方服务的信息共享。

OAuth的工作原理

OAuth协议通常涉及以下几个主要角色:

  1. 用户:资源的拥有者,通过客户端向服务提供者授权访问其资源。
  2. 客户端:第三方应用程序,希望访问用户资源的应用。
  3. 服务提供者(也称资源服务器或授权服务器):资源的托管方,提供了OAuth授权机制的实现,允许访问用户的资源。

OAuth的授权过程大致可以分为以下几个步骤:

  1. 用户授权:用户通过客户端应用请求访问某个服务提供者上的资源,并同意授权。
  2. 获取授权凭证:客户端应用向服务提供者请求授权凭证(如授权码或令牌)。
  3. 访问资源:客户端应用使用授权凭证向服务提供者请求访问用户资源。
  4. 验证授权凭证:服务提供者验证授权凭证的有效性,并决定是否允许访问请求的资源。
    在这里插入图片描述

OAuth的应用场景

OAuth因其安全性和灵活性,在多个场景下得到了广泛应用,包括但不限于:

  1. 第三方登录:允许用户通过微信、QQ、微博等第三方平台登录自己的应用或网站。
  2. 开放平台:为开发者提供接口,允许他们通过OAuth协议访问平台上的用户数据或执行特定操作。
  3. 单点登录(SSO):在微服务架构中,实现用户只需登录一次即可访问多个系统或服务。

OAuth的版本

目前,OAuth协议已经发展到了多个版本,其中OAuth 2.0是最常用的版本。OAuth 2.0定义了几种授权类型,包括授权码模式(Authorization Code Grant)、隐式模式(Implicit Grant)、密码凭证模式(Resource Owner Password Credentials Grant)和客户端凭证模式(Client Credentials Grant)等,以满足不同场景下的授权需求。

总的来说,OAuth是一种强大的授权协议,它为用户和开发者提供了一种安全、便捷的方式来共享和访问资源。

Spring Security OAuth 2.0

Spring Security OAuth 2.0 是一个结合了Spring Security和OAuth 2.0协议的安全框架,它提供了在Java应用程序中实现身份验证和授权的高级支持。下面从几个方面对Spring Security OAuth 2.0进行详细阐述:

一、定义与概述

  • OAuth 2.0:是一个开放标准的授权协议,允许第三方应用程序在用户的许可下访问他们在其他服务上的资源和数据,而无需直接共享用户的用户名和密码。OAuth 2.0 关注于简化客户端开发、提高安全性,并支持多种应用场景。
  • Spring Security:是一个全面的安全框架,用于在Java应用程序中提供身份验证和授权机制。它支持多种身份验证技术,包括表单登录、HTTP Basic认证、LDAP等。
  • Spring Security OAuth 2.0:是Spring Security框架对OAuth 2.0协议的实现,允许开发人员轻松地集成OAuth 2.0的功能到他们的应用程序中,实现第三方应用的登录和授权流程。

二、主要角色与组件

  • 资源所有者(Resource Owner):通常是一个用户,拥有一些受保护的资源(如个人信息、照片等)。
  • 资源服务器(Resource Server):托管受保护资源的服务器,能够处理来自客户端的请求,并根据访问令牌(Access Token)返回受保护的资源。
  • 客户端(Client):第三方应用程序,试图访问资源服务器上受保护的资源。
  • 授权服务器(Authorization Server):验证资源所有者的身份,颁发访问令牌给客户端。

三、授权流程

Spring Security OAuth 2.0 支持多种授权类型(Grant Types),以适应不同场景的需求:

  1. 授权码模式(Authorization Code Grant):适用于具有服务器端组件的应用程序。客户端通过将用户重定向到授权服务器来获得授权码,然后使用授权码向授权服务器请求访问令牌。
  2. 密码模式(Password Grant):适用于用户与应用程序之间建立信任关系的场景。客户端直接向授权服务器请求访问令牌,需要提供用户的用户名和密码。但存在安全风险,因为需要直接处理用户的凭据。
  3. 客户端凭据模式(Client Credentials Grant):适用于无需用户交互,仅访问客户端自身资源的场景。客户端使用自己的凭据向授权服务器请求访问令牌。
  4. 隐式模式(Implicit Grant):适用于纯前端应用程序,如JavaScript单页面应用。客户端通过将用户重定向到授权服务器,直接获得访问令牌,而无需先获取授权码。但存在安全风险,因为令牌可能会暴露在客户端代码中。
    在这里插入图片描述

四、优势与应用场景

  • 优势:Spring Security OAuth 2.0 简化了OAuth 2.0协议的实现,使得开发人员能够更容易地在Java应用程序中集成OAuth 2.0功能。同时,它提供了强大的安全机制,保护应用程序的资源和数据不被未经授权的访问。
  • 应用场景:包括但不限于第三方应用登录(如使用QQ、微信等授权登录到其他网站或App)、分布式或微服务项目中的授权等。

综上所述,Spring Security OAuth 2.0 是一个功能强大的安全框架,它通过结合Spring Security和OAuth 2.0协议的优势,为Java应用程序提供了高效、安全的身份验证和授权解决方案。

JWT 在 OAuth2 中的作用

JWT 的基本概念

JWT 是一种紧凑且自包含的令牌,用于在网络应用环境中安全地传递信息。JWT 可以用来进行身份验证和信息交换。一个 JWT 通常包括三部分:

  1. 头部(Header):指定令牌的类型(JWT)和签名算法(如 HMAC SHA256 或 RSA)。
  2. 有效载荷(Payload):包含声明(Claims),这些声明可以是关于实体(例如用户)和其他数据的。
  3. 签名(Signature):为了验证消息在传输过程中没有被篡改,使用指定的算法和密钥对头部和有效载荷进行签名。

在 OAuth2 协议中,JWT 通常用作访问令牌(Access Token)。访问令牌是授权服务器颁发给客户端的令牌,用于访问受保护的资源。

  1. 身份验证:客户端使用 JWT 作为访问令牌来访问受保护的资源。资源服务器验证 JWT 的有效性,确保它是由信任的授权服务器签发的,并且没有被篡改。

  2. 无状态:JWT 是自包含的,包含了所有需要的信息(例如用户 ID 和权限),因此资源服务器无需查询数据库或会话存储来获取用户信息。这使得资源服务器能够无状态地验证令牌。

在 Spring Security 中使用 JWT

在 Spring Security 中,你可以配置资源服务器来验证 JWT。这通常涉及以下步骤:

  1. 配置 JWT 资源服务器:在 application.ymlapplication.properties 中指定 JWT 配置,通常包括颁发者 URI 和公钥。

    spring:
      security:
        oauth2:
          resourceserver:
            jwt:
              issuer-uri: https://example.com/oauth2/issuer
    
  2. 配置 SecurityConfig:在 Spring Security 配置中启用 JWT 资源服务器支持。

    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.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
    
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .csrf().disable()
                .authorizeRequests()
                    .antMatchers("/public/**").permitAll() // 公开接口
                    .anyRequest().authenticated()
                .and()
                .oauth2ResourceServer()
                    .jwt(); // 启用 JWT 验证
        }
    }
    
  3. 令牌验证:当客户端请求受保护的资源时,它需要在请求中包含 JWT。资源服务器会验证该 JWT,包括检查签名和令牌的有效性(例如是否过期)。

总结

JWT 是 OAuth2 认证流程中常用的访问令牌格式。它在 Spring Security OAuth2 中的作用是允许资源服务器验证传入的 JWT,以确保请求是经过授权的。通过配置 JWT,Spring Security 可以无缝地处理 OAuth2 认证,确保你的应用的安全性。

开放接口代码示例

在Spring Security OAuth2中,开放平台 API 通常涉及到使用 OAuth2 协议来进行身份验证和授权。这允许其他应用通过 OAuth2 来访问你的 API。以下是一个简单的示例,演示如何配置和实现一个开放平台 API。

1. 添加依赖

首先,确保你的 pom.xml(对于 Maven)中包含以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

2. 配置 Spring Security

在你的 application.yml 中配置 OAuth2 相关的属性。例如,如果你使用的是 OAuth2 Authorization Server(例如使用 Keycloak、Auth0 等),你需要配置认证服务器的公共密钥等信息:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://example.com/oauth2/issuer

3. 配置 SecurityConfig

创建一个配置类来设置安全策略:

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.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/public/**").permitAll() // 公开接口
                .anyRequest().authenticated()
            .and()
            .oauth2ResourceServer()
                .jwt();
    }
}

4. 配置 Controller

创建一个控制器来处理公开的 API 请求。例如:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/public")
public class PublicController {

    @GetMapping("/info")
    public String getInfo() {
        return "This is a public endpoint!";
    }
}

5. 运行和测试

启动你的 Spring Boot 应用程序,并尝试访问公开的 API,例如 http://localhost:8080/public/info,应该能够不经过身份验证地访问这个端点。

对于需要身份验证的接口,你可以通过访问令牌来确保请求者已授权访问:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/secure")
public class SecureController {

    @GetMapping("/data")
    public String getSecureData() {
        return "This is a secured endpoint!";
    }
}

确保在请求这个端点时,附上有效的 OAuth2 访问令牌。

总结

这个示例展示了如何使用 Spring Security OAuth2 来开放一些 API 端点,同时保护其他端点。你需要配置 OAuth2 资源服务器,定义安全策略,并创建 API 控制器来处理请求。根据你的需求,可以进一步配置角色和权限。

单点登录代码示例

单点登录(SSO,Single Sign-On)允许用户在一个应用中登录后,自动获得对其他相关应用的访问权限。使用 OAuth2 和 JWT 实现单点登录通常涉及到一个认证服务器和多个资源服务器。以下是如何使用 Spring Security 和 JWT 实现 SSO 的一个基本示例。

1. 设置认证服务器

认证服务器负责处理用户的登录请求,并颁发 JWT 令牌。这里我们使用 Spring Boot 和 Spring Security OAuth2 来构建一个简单的认证服务器。

添加依赖

pom.xml 中添加 OAuth2 认证服务器的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-authserver</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
配置认证服务器

创建一个配置类来设置 OAuth2 认证服务器:

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.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("client-id")
            .secret("{noop}client-secret")
            .authorizedGrantTypes("password", "refresh_token")
            .scopes("read", "write")
            .accessTokenValiditySeconds(3600)
            .refreshTokenValiditySeconds(36000);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.tokenStore(new InMemoryTokenStore());
    }
}
配置 Web 安全
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.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;

@Configuration
@EnableAuthorizationServer
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/oauth/token").permitAll()
            .anyRequest().authenticated()
            .and()
            .csrf().disable();
    }
}

2. 设置资源服务器

资源服务器使用 JWT 来验证用户的请求。以下是一个简单的资源服务器的配置示例。

添加依赖

pom.xml 中添加资源服务器的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
配置资源服务器
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.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt();
    }
}
资源服务器的 Controller
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/data")
    public String getData() {
        return "This is a protected resource!";
    }
}

3. 测试单点登录

  1. 获取令牌:使用认证服务器的 /oauth/token 端点来获取 JWT 令牌。你可以使用 curl 或 Postman 来发送 POST 请求,例如:

    curl -X POST 'http://localhost:8080/oauth/token' \
    -d 'grant_type=password&username=user&password=password' \
    -u 'client-id:client-secret'
    

    你将获得一个 JSON 响应,其中包含 access_token

  2. 访问资源:使用获取的访问令牌来访问资源服务器的受保护端点,例如:

    curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" http://localhost:8081/api/data
    

    替换 YOUR_ACCESS_TOKEN 为实际的令牌。

总结

在这个示例中,我们创建了一个认证服务器和一个资源服务器,使用 JWT 来实现单点登录。认证服务器颁发 JWT 令牌,资源服务器验证这个令牌来保护 API 端点。这样,用户在一个应用中登录后,可以使用相同的令牌访问其他应用的受保护资源。

相关面试题

基础概念

  1. 什么是 OAuth2?

    • 答案: OAuth2 是一个授权框架,它允许第三方应用在不暴露用户凭据的情况下访问用户在另一应用上的资源。OAuth2 通过颁发令牌来实现授权,令牌可以是访问令牌、刷新令牌等。
  2. JWT 的结构是什么?

    • 答案: JWT(JSON Web Token)由三部分组成:
      • 头部(Header): 指定令牌的类型和签名算法。
      • 有效载荷(Payload): 包含声明(Claims),可以是关于用户或其他数据。
      • 签名(Signature): 使用指定的算法和密钥对头部和有效载荷进行签名,用于验证数据的完整性和真实性。
  3. OAuth2 的授权流程有哪些?

    • 答案: OAuth2 主要有以下授权流程:
      • 授权码模式(Authorization Code):用于 Web 应用的授权。
      • 隐式模式(Implicit):用于浏览器中的 JavaScript 应用。
      • 密码模式(Password):用于信任的客户端(如移动应用)。
      • 客户端凭证模式(Client Credentials):用于服务对服务的授权。

配置和实现

  1. 如何在 Spring Security 中配置 OAuth2 资源服务器?

    • 答案: 在 application.ymlapplication.properties 中配置 JWT 资源服务器,并在 SecurityConfig 中启用 JWT 验证,例如:
      @Configuration
      @EnableWebSecurity
      public class SecurityConfig extends WebSecurityConfigurerAdapter {
      
          @Override
          protected void configure(HttpSecurity http) throws Exception {
              http
                  .csrf().disable()
                  .authorizeRequests()
                      .antMatchers("/public/**").permitAll()
                      .anyRequest().authenticated()
                  .and()
                  .oauth2ResourceServer()
                      .jwt();
          }
      }
      
  2. 如何使用 Spring Security 配置 OAuth2 认证服务器?

    • 答案: 创建一个继承 AuthorizationServerConfigurerAdapter 的配置类,并配置客户端、令牌存储等信息,例如:
      @Configuration
      @EnableAuthorizationServer
      public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
      
          @Override
          public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
              clients.inMemory()
                  .withClient("client-id")
                  .secret("{noop}client-secret")
                  .authorizedGrantTypes("password", "refresh_token")
                  .scopes("read", "write")
                  .accessTokenValiditySeconds(3600)
                  .refreshTokenValiditySeconds(36000);
          }
      
          @Override
          public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
              endpoints.tokenStore(new InMemoryTokenStore());
          }
      }
      

安全和最佳实践

  1. 如何保护 JWT 令牌的安全?

    • 答案: 保护 JWT 令牌的方法包括:
      • 使用 HTTPS:确保所有通信通过 HTTPS 进行,以防止中间人攻击。
      • 令牌加密:对 JWT 进行加密,以保护其内容不被未授权访问。
      • 令牌过期:设置合理的令牌过期时间,使用刷新令牌机制续订令牌。
  2. OAuth2 和 JWT 的主要优缺点是什么?

    • 答案:
      • 优点:
        • 无状态:JWT 是自包含的,不需要服务器存储会话信息。
        • 易于扩展:支持多种授权模式和灵活的权限管理。
      • 缺点:
        • 令牌泄露风险:如果 JWT 被盗,可能会被用来伪造用户身份。
        • 令牌更新复杂性:处理令牌的过期和续订需要额外的逻辑。

高级问题

  1. 如何实现 OAuth2 的客户端凭证模式?

    • 答案: 客户端凭证模式用于服务到服务的授权。客户端使用其凭证(客户端 ID 和密钥)请求访问令牌。配置客户端凭证模式时,通常会在认证服务器的配置中设置客户端凭证。
  2. 如何使用 OAuth2 实现单点登录(SSO)?

    • 答案: 实现单点登录的步骤包括:
      • 配置一个认证服务器:处理用户登录并颁发令牌。
      • 配置多个资源服务器:通过验证来自认证服务器的令牌来保护资源。
      • 在应用中共享认证信息:使用 OAuth2 的令牌在不同应用之间传递用户身份。
  3. 如何处理 OAuth2 中的授权码重放攻击?

    • 答案: 通过使用短期有效的授权码、确保授权码只能使用一次、并且在服务器端保存已使用的授权码来防止重放攻击。

这些面试题覆盖了 OAuth2 和 JWT 的基本概念、配置、最佳实践以及一些高级用例,有助于评估候选人在身份验证和授权方面的能力。

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

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

相关文章

安防监控/软硬一体/视频汇聚网关EasyCVR硬件启动崩溃是什么原因?

安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、WS-FMP4、HTTP-…

PyTorch深度学习网络(二:CNN)

卷积神经网络&#xff08;CNN&#xff09;是一种专门用于处理具有类似网格结构数据的深度学习模型&#xff0c;例如图像&#xff08;2D网格的像素&#xff09;和时间序列数据&#xff08;1D网格的信号强度&#xff09;。CNN在图像识别、图像分类、物体检测、语音识别等领域有着…

API网关之Kong

Kong 是一个高性能的开源 API 网关和微服务管理平台&#xff0c;用于管理、保护和扩展 API 和微服务。它最初由 Mashape 公司开发&#xff0c;并于 2015 年作为开源项目发布。Kong 能够处理 API 的路由、认证、负载均衡、缓存、监控、限流等多种功能&#xff0c;是微服务架构中…

Mysql中count(*) over 用法讲解

Mysql中count&#xff08;*&#xff09; over &#xff08;&#xff09;用法讲解 一、原理1、原理介绍 二、下面是一个使用COUNT(*) OVER()的代码示例&#xff1a;1、代码示例2、结果详解3、COUNT(*) OVER() 分区用法 三 、总结 一、原理 1、原理介绍 在MySQL中&#xff0c;C…

MySQL集群的基础部署及主从复制详解

一、Msql在服务器中的部署方法 官网&#xff1a;http://www.mysql.com 在企业中90%的服务器操作系统均为Linux 在企业中对于Mysql的安装通常用源码编译的方式来进行 1.1 在Linux下部署MySQL 1.1.1 部署环境 主机IP角色MySQL-node1172.25.254.13masterMySQL-node2172.25.…

【C语言】深入理解指针(四)qsort函数的实现

指针4 1.回调函数是什么2.qsort使用举例3.qsort函数的模拟实现 1.回调函数是什么 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#xff0c;被调⽤的…

【CanMV K230】外接传感器

【CanMV K230】外接传感器 外接LED灯 B站视频链接 抖音链接 我们后面主要做是机器视觉。K230能帮我们捕捉到图像信息。更多小功能需要我们自己来做。 比如舵机抬杆&#xff0c;测温报警等 都需要我们外接传感器。 本篇就来分享一下如何使用K230外接传感器 首先需要知道K230…

Leetcode JAVA刷刷站(98)验证二叉搜索树

一、题目概述 二、思路方向 在Java中&#xff0c;要判断一个二叉树是否是有效的二叉搜索树&#xff08;BST&#xff09;&#xff0c;我们可以采用递归的方法&#xff0c;通过维护一个外部的范围&#xff08;通常是Integer.MIN_VALUE到Integer.MAX_VALUE作为初始范围&#xff…

网络优化4|网络流问题|路径规划问题|车辆路径问题

网络流问题 网络最大流问题 研究网络通过的流量也是生产管理中经常遇到的问题 例如&#xff1a;交通干线车辆最大通行能力、生产流水线产品最大加工能力、供水网络中最大水流量等。这类网络的弧有确定的容量&#xff0c;虽然常用 c i j c_{ij} cij​表示从节点 i i i到节点 j…

怎么检测电脑的RAM?丨什么是RAM?

RAM 是 Random Access Memory 的缩写&#xff0c;它是一个允许计算机短期存储数据以更快访问的组件。众所周知&#xff0c;操作系统、应用程序和各种个人文件都存储在硬盘驱动器中。 当 CPU 需要调用硬盘上的数据进行计算和运行时&#xff0c;CPU 会将数据传输到 RAM 中进行计…

安防视频汇聚平台EasyCVR启动后无法访问登录页面是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等…

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南&#xff1f;Jenkins怎么配置服务器&#xff1f; Jenkins作为一个流行的自动化服务器&#xff0c;其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能&#xff0c;以实现自动化通知。 Jenkins发邮件&#xf…

NVI技术创新联盟成立,BOSMA博冠IP轻量化制播已运用

2024年北京国际广播电影电视展览会&#xff08;BIRTV&#xff09;首日&#xff0c;由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV 2024超高清全产业链发展研讨会上宣布正式成立。作为国产8K摄像机先行者&#xff0c;BOSMA博冠受邀加入NVI技术…

Flowable BPMN bpmnjs 设计器

最近半年我一直在打造一款行业顶尖的流程设计器&#xff0c;适配了flowable所有的组件&#xff0c;美观&#xff0c;大方&#xff0c;灵活&#xff0c;好用。所有的组件都进行严格的测试并在生产环境上线了。 1、在线预览 2、整体框架布局 3、组件分组 4、完整模式切换 给大…

若依,前后端分离项目,部署到服务器

1.后端项目用maven打包 正式服的话&#xff0c;测试不用加。 application.yml加上context-path: /prod-api 一定要选择root的ruoyi&#xff0c;他会把你自动打包其他模块的依赖 全部成功。然后去ruoyi-admin拿到这个包&#xff0c;java -jar ruoyi-admin.jar就可以了 将jar上…

STM32嵌套向量中断控制器—NVIC

NVIC简介&#xff1a; NVIC&#xff0c;即Nested Vectored Interrupt Controller&#xff08;嵌套向量中断控制器&#xff09;&#xff0c;是STM32中的中断控制器。它负责管理和协调处理器的中断请求&#xff0c;是STM32中处理异步事件的重要机制。 NVIC提供了灵活、高效、可扩…

IoTDB 在顶级会议 VLDB 2024:四篇最新论文入选,特邀做 TPC 报告与讨论会!

再获权威顶会认可 8 月 26 日至 8 月 30 日&#xff0c;数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 三篇论文的最新研发成果被本次大会录用&#xff0c;这其中也包括 TsFile 成为 Apache Top-Level 项目后发表的第一篇顶会论文。 同时&#xff0c;在国际权威数据库…

博弈论详解 2(SG函数 和 SG定理)

传送门&#xff1a;博弈论详解 1&#xff08;基本理论定义 和 Nim 游戏&#xff09; 什么是 SG 函数 接着上次的讲解&#xff0c;我们来了解一个更通用的模型。我们把每一个状态变成一个点&#xff08;在 Nim 游戏里就代表 a a a 数组&#xff09;&#xff0c;如果可以从一种…

008、架构_分布式事务

分布式事务控制 对于一个分布式写事务,计算节点会向GTM申请全局事务GTID,GTID申请成功后,称当前GTID对应的事务是活跃事务,处于未提交状态。如果涉及数据更新,则将GTID信息同步更新到该事务要更新的事务中。成功提交事务后,这里的成功是指分布式事务涉及所有数据节点均提…