Spring OAuth2:开发者的安全盾牌!(上)

news2024/11/15 17:53:02

何利用Spring OAuth2构建坚不可摧的安全体系?如何使用 OAuth2 从跨域挑战到性能优化,每一个环节都为你的应用保驾护航?

文章目录

  • Spring OAuth2 详解
    • 1. 引言
      • 简述OAuth2协议的重要性
      • Spring Framework对OAuth2的支持概述
    • 2. 背景介绍
      • 2.1 OAuth2协议基础
        • 协议发展历程
        • 四种授权模式概述
      • 2.2 Spring Security与OAuth2集成
        • Spring Security的作用
        • OAuth2在Spring生态中的位置
    • 3. OAuth2核心组件
      • 3.1 资源所有者
        • 用户与授权过程
      • 3.2 客户端
        • 公开、保密客户端区别
      • 3.3 授权服务器
        • 功能与职责
        • 令牌类型介绍
      • 3.4 保护资源服务器
        • 如何验证访问令牌
    • 4. 实现授权码模式
      • 4.1 流程解析
        • 请求授权码
        • 交换令牌
        • 访问受保护资源
      • 4.2 Spring配置示例
        • 定义安全配置
        • 配置授权与令牌端点
    • 5. 简化模式与隐式授权
      • 5.1 适用场景对比
        • 简化模式特点
        • 隐式授权风险
      • 5.2 实践指导
        • 配置调整与实现要点

在这里插入图片描述

Spring OAuth2 详解

1. 引言

想象一下,你是一个在数字世界中的冒险者,你有一个宝箱,里面装满了你的个人数据和应用权限。这个宝箱非常珍贵,你不想随便让人打开。但是,你需要与朋友分享一些宝物,比如你的相册或者你的游戏分数。这时候,OAuth2协议就像是一个聪明的管家,它可以帮助管理谁可以访问你的宝箱,以及访问的权限有多大。

简述OAuth2协议的重要性

OAuth2协议就像是数字世界中的一把钥匙,它允许用户授权第三方应用访问他们的数据,而无需分享他们的用户名和密码。这就像是一个信任的桥梁,连接用户、应用和数据。它的重要性在于:

  • 安全性:保护用户的账户信息,避免直接暴露敏感数据。
  • 灵活性:支持多种授权模式,适应不同的应用场景。
  • 扩展性:允许第三方应用在用户授权的情况下,访问和操作用户数据。

Spring Framework对OAuth2的支持概述

Spring Framework,这个强大的后端开发框架,对OAuth2的支持就像是给这个宝箱加上了一把高科技的锁。Spring Security是一个全面的安全框架,它与OAuth2的集成使得在Spring应用中实现安全、灵活的授权变得简单。

  • 集成:Spring Security提供了与OAuth2协议的无缝集成。
  • 简化:通过Spring的配置和注解,简化了OAuth2的实现过程。
  • 扩展:支持自定义扩展,以满足特定需求。

想象一下,你是一个开发者,你正在构建一个应用,你需要确保用户数据的安全,同时也要让其他应用能够安全地访问这些数据。OAuth2和Spring Security的结合,就像是给你的数字宝箱加上了一把智能锁,让你可以轻松管理谁可以访问,以及访问的权限有多大。

这就是为什么OAuth2协议和Spring Framework对它的支持如此重要。它们不仅保护了用户的隐私,还为开发者提供了一个强大而灵活的工具,以构建安全、可靠的应用程序。接下来,我们将深入探讨OAuth2的背景和核心组件,以及如何在Spring中实现它。准备好了吗?让我们开始这段有趣的旅程吧!

2. 背景介绍

2.1 OAuth2协议基础

在数字世界的冒险旅程中,我们来到了一个叫做OAuth2的神秘岛屿。这个岛屿上,有一个古老的协议,它帮助保护着岛上居民的宝贵资源。这个协议,就是OAuth2。

协议发展历程

OAuth2协议的诞生,可以追溯到一个叫做OAuth1的前辈。OAuth1是一个强大的守护者,但它有点复杂,使用起来不太方便。随着时间的推移,岛上的居民们需要一个更简单、更灵活的方式来保护他们的资源。于是,OAuth2诞生了,它不仅继承了前辈的优点,还加入了更多的创新和灵活性。

四种授权模式概述

OAuth2协议有四种授权模式,就像是岛上的四种不同的守护兽,每种都有其独特的能力:

  1. 授权码模式:这是最常用的守护兽,它通过一个安全的中间人(授权服务器)来交换访问令牌。
  2. 简化模式:这个守护兽适合快速简单的任务,它直接在URL中传递令牌,但要小心,因为它可能会暴露令牌。
  3. 密码模式:这个守护兽信任用户,允许用户直接提供他们的凭证来获取令牌。
  4. 客户端凭证模式:这个守护兽是为岛上的内部服务设计的,它允许服务之间直接使用客户端ID和密钥来交换令牌。

2.2 Spring Security与OAuth2集成

现在,让我们转向另一个强大的盟友——Spring Security。Spring Security是一个全面的安全框架,它与OAuth2的集成,就像是给岛上的居民提供了一个更加强大的保护系统。

Spring Security的作用

Spring Security的作用就像是岛上的守护神,它保护着岛上的居民和他们的资源不受外来侵害。它提供了:

  • 认证:确保访问者是他们声称的那个人。
  • 授权:确保访问者有权限访问他们请求的资源。
OAuth2在Spring生态中的位置

OAuth2在Spring生态中的位置,就像是岛上的守护塔,它连接着Spring Security和岛上的居民。通过Spring Security的OAuth2支持,开发者可以:

  • 轻松实现:通过Spring的配置和注解,简化OAuth2的实现。
  • 高度定制:根据需要定制授权流程和令牌管理。
  • 无缝集成:与Spring的其他安全特性无缝集成,如CSRF保护、会话管理等。

通过这个集成,开发者可以构建既安全又灵活的应用,保护用户的资源,同时允许第三方应用在用户授权的情况下访问这些资源。这就像是在数字世界中的冒险旅程中,找到了一个既强大又可靠的伙伴,帮助我们安全地探索未知的领域。

现在,我们已经了解了OAuth2协议的背景和它在Spring生态中的位置。接下来,我们将深入探讨OAuth2的核心组件,以及如何在Spring中实现它。准备好了吗?让我们继续这段旅程,探索更多的秘密吧!
在这里插入图片描述

3. OAuth2核心组件

3.1 资源所有者

想象一下,你是一个拥有丰富宝藏的海盗船长,你的宝藏就是你的个人数据。在OAuth2的世界里,你就是资源所有者。你的宝藏被锁在一个安全的箱子里,只有你才能决定谁可以打开它。

用户与授权过程

当你想分享你的宝藏(数据)给其他海盗(第三方应用)时,你不会直接给他们钥匙(用户名和密码)。相反,你给他们一张藏宝图(授权码),他们可以用这张图来找到你的宝藏守护者(授权服务器),并从守护者那里得到进入宝藏箱的钥匙(访问令牌)。

3.2 客户端

在这个故事中,客户端就像是那些想要访问你宝藏的海盗。他们需要你的允许才能拿到宝藏。

公开、保密客户端区别
  • 公开客户端:这些是那些在开放海域(公共环境)中的海盗,他们不能保守秘密。因此,他们的客户端密钥(如果他们有的话)不能保密,可能会被任何人看到。
  • 保密客户端:这些海盗在他们的船舱里(安全环境)操作,他们可以保守秘密。他们的客户端密钥是保密的,只有他们自己知道。

3.3 授权服务器

授权服务器是这个故事中的宝藏守护者。他们负责管理谁可以访问宝藏。

功能与职责

授权服务器的职责包括:

  • 验证请求:确保请求访问宝藏的海盗是经过资源所有者(你)授权的。
  • 发放令牌:一旦验证通过,授权服务器会给海盗发放访问宝藏的钥匙(访问令牌)。
令牌类型介绍

授权服务器会发放几种不同类型的钥匙:

  • 访问令牌:这是进入宝藏箱的主要钥匙。
  • 刷新令牌:这是一种特殊的钥匙,可以在访问令牌过期后用来获取新的访问令牌,而不需要再次进行完整的授权过程。

3.4 保护资源服务器

保护资源服务器是宝藏箱本身,它需要确保只有持有正确钥匙的人才能打开它。

如何验证访问令牌

当一个海盗(客户端)带着钥匙(访问令牌)来到宝藏箱前,保护资源服务器会:

  • 检查令牌:确保令牌是有效的,没有过期,且是由授权服务器发放的。
  • 验证权限:确保令牌对应的权限允许海盗访问他们请求的宝藏部分。

例子

假设你有一个在线相册应用,用户(资源所有者)想要通过第三方应用分享他们的相册。用户会通过你的应用(授权服务器)授权第三方应用。你的应用会发放一个访问令牌给第三方应用,第三方应用随后可以使用这个令牌来访问用户的相册(受保护的资源)。

代码示例

// 用户请求访问令牌
@GetMapping("/authorize")
public String authorizeUser(@RequestParam("client_id") String clientId,
                            @RequestParam("redirect_uri") String redirectUri,
                            @RequestParam("response_type") String responseType,
                            HttpSession session) {
    // 验证客户端ID等信息...
    // 假设用户同意授权
    session.setAttribute("client_id", clientId);
    return "redirect:" + redirectUri + "?code=some_auth_code";
}

// 第三方应用使用授权码交换访问令牌
@PostMapping("/token")
public ResponseEntity<?> getAccessToken(@RequestBody MultiValueMap<String, String> requestBody,
                                        HttpServletRequest request) {
    // 验证授权码、客户端ID和密钥...
    // 发放访问令牌
    return ResponseEntity.ok(new AccessToken("access_token", "refresh_token", "user_id"));
}

在这段代码中,我们创建了两个简单的端点:一个用于用户授权,另一个用于使用授权码交换访问令牌。这只是一个简化的例子,实际应用中会有更多的安全检查和复杂逻辑。

通过这些核心组件,OAuth2协议确保了用户数据的安全和合理的访问控制。在下一章中,我们将深入探讨如何实现授权码模式,并提供更多的代码示例和实践指导。准备好了吗?让我们继续这段有趣的旅程!

4. 实现授权码模式

4.1 流程解析

在OAuth2的冒险故事中,授权码模式就像是一场精心设计的寻宝游戏。在这个游戏中,海盗们(客户端)需要通过一系列的步骤来获取宝藏(受保护的资源)。

请求授权码

第一步,海盗们需要向宝藏守护者(授权服务器)请求一张藏宝图(授权码)。他们需要提供一些信息,比如他们是谁(客户端ID),他们想要访问的宝藏(资源所有者的同意),以及他们成功获取宝藏后应该去哪里(重定向URI)。

这个过程可以用以下步骤概括:

  1. 客户端重定向用户:客户端将用户重定向到授权服务器的授权端点。
  2. 用户登录:用户在授权服务器上登录并验证自己的身份。
  3. 授权同意:用户同意授权客户端访问他们的资源。
  4. 授权服务器发放授权码:如果用户同意,授权服务器将发放一个授权码给客户端。
交换令牌

第二步,海盗们(客户端)拿着藏宝图(授权码)回到宝藏守护者那里,请求换取真正的钥匙(访问令牌)。

这个过程包括:

  1. 客户端发送授权码:客户端将授权码发送到授权服务器的令牌端点。
  2. 授权服务器验证授权码:授权服务器验证授权码的有效性。
  3. 发放访问令牌:如果授权码有效,授权服务器发放访问令牌和刷新令牌。
访问受保护资源

最后一步,海盗们拿着真正的钥匙(访问令牌)来到宝藏箱(受保护资源服务器)前,展示他们的钥匙以访问宝藏。

  1. 客户端发送访问令牌:客户端将访问令牌发送到受保护资源服务器。
  2. 受保护资源服务器验证访问令牌:服务器验证访问令牌的有效性。
  3. 提供资源:如果访问令牌有效,服务器提供请求的资源。

4.2 Spring配置示例

现在,让我们用Spring的语言来编写这个故事,看看如何配置授权码模式。

定义安全配置

首先,我们需要定义一个安全配置,告诉Spring如何保护我们的宝藏。

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    // 省略了其他配置,比如数据库连接、客户端详情服务等

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
            .authorizationCodeServices(new AuthorizationCodeServices())
            .tokenStore(tokenStore())
            // 其他配置...
            ;
    }

    // 配置授权码服务、令牌存储等
}
配置授权与令牌端点

接下来,我们需要配置授权端点和令牌端点,这样海盗们就知道如何请求藏宝图和真正的钥匙。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/authorize**").permitAll() // 授权端点对所有人开放
                .anyRequest().authenticated() // 其他请求需要认证
            .and()
            .oauth2Login() // 配置OAuth2登录
            .and()
            // 其他配置...
            ;
    }
}

在这个配置中,我们告诉Spring哪些端点是公开的(比如授权端点),哪些需要用户认证。我们还配置了OAuth2登录,这样用户就可以登录并授权访问他们的资源。

例子

假设你正在构建一个在线图书馆应用,用户可以借阅电子书。第三方应用(比如一个阅读统计应用)想要访问用户的借阅历史。用户通过你的应用授权第三方应用,第三方应用使用授权码模式来获取访问令牌,并访问用户的借阅历史。

代码示例

// 用户访问授权端点
@GetMapping("/authorize")
public String authorize(@RequestParam("response_type") String responseType,
                        @RequestParam("client_id") String clientId,
                        @RequestParam("redirect_uri") String redirectUri,
                        @RequestParam("scope") String scope,
                        HttpSession session) {
    // 这里会进行用户认证和授权同意的逻辑
    // 发放授权码
    return "redirect:" + redirectUri + "?code=some_auth_code";
}

// 客户端使用授权码交换访问令牌
@PostMapping("/token")
public ResponseEntity<?> exchangeForAccessToken(@RequestBody MultiValueMap<String, String> parameters,
                                                HttpServletRequest request) {
    // 验证授权码,发放访问令牌
    AccessToken accessToken = new AccessToken("access_token", "refresh_token", "user_id");
    return ResponseEntity.ok(accessToken);
}

在这些代码示例中,我们创建了授权端点和令牌端点,用户可以通过这些端点进行授权和交换访问令牌。这些只是简化的示例,实际应用中会有更多的安全检查和复杂逻辑。

通过这些步骤和配置,我们就可以在Spring中实现授权码模式,确保用户资源的安全访问。在下一章中,我们将探讨简化模式与隐式授权,看看它们是如何工作的,以及它们适用的场景。准备好了吗?让我们继续这段寻宝之旅!
在这里插入图片描述

5. 简化模式与隐式授权

5.1 适用场景对比

在OAuth2的世界里,除了授权码模式这个寻宝游戏,还有两种更简单、更直接的方式,那就是简化模式和隐式授权。

简化模式特点

简化模式就像是一张快速通行证,它允许海盗们(客户端)在不需要宝藏守护者(授权服务器)的情况下,直接从用户(资源所有者)那里获取访问令牌。这种方式适合于那些海盗们已经获得了用户信任的情况。

  • 适用场景:用户与客户端之间有高度信任,例如,客户端是用户自己的设备上的应用程序。
  • 优点:流程简单,不需要服务器间的交互。
  • 缺点:访问令牌可能会在不安全的环境中传输,增加了安全风险。
隐式授权风险

隐式授权就像是一张没有经过宝藏守护者验证的藏宝图,海盗们可以直接使用这张图来获取宝藏。这种方式虽然方便,但也存在一些风险。

  • 适用场景:适用于客户端无法安全存储客户端密钥的情况,如纯前端应用。
  • 风险:访问令牌可能会在URL中暴露,增加了被截获的风险。

5.2 实践指导

配置调整与实现要点

在使用简化模式或隐式授权时,我们需要对Spring Security的配置进行一些调整,以适应这些模式的特点。

配置示例

@Configuration
public class OAuth2Config extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                // 允许所有用户访问简化模式和隐式授权的端点
                .antMatchers("/login", "/oauth2/authorize").permitAll()
                .anyRequest().authenticated()
            .and()
            .oauth2Login()
            .and()
            // 其他配置...
            ;
    }
}

在这个配置中,我们允许所有用户访问登录和授权端点,这些端点是简化模式和隐式授权的关键部分。

例子

假设你正在构建一个社交媒体应用,用户可以通过他们的智能手表(一个没有服务器端点的客户端)来发布状态更新。在这种情况下,简化模式就非常合适,因为智能手表可以安全地存储访问令牌,并且用户对其有高度信任。

代码示例

// 用户登录并授权客户端
@GetMapping("/login")
public String login(@RequestParam("client_id") String clientId,
                    @RequestParam("response_type") String responseType,
                    @RequestParam("redirect_uri") String redirectUri,
                    HttpSession session) {
    // 用户登录逻辑...
    // 假设用户已登录并授权
    session.setAttribute("client_id", clientId);
    return "redirect:" + redirectUri + "?access_token=some_access_token&token_type=bearer";
}

// 客户端直接从响应中获取访问令牌
// 这通常在客户端的JavaScript代码中处理

在简化模式中,客户端直接从用户那里获取访问令牌,而不需要通过授权服务器。这种方式简化了流程,但需要确保客户端能够安全地处理访问令牌。

通过这些配置和实践指导,我们可以在Spring中实现简化模式和隐式授权,同时注意它们的适用场景和潜在风险。在下一章中,我们将探讨客户端凭证模式和密码模式,这两种模式适用于不同的场景,并且有其独特的实现方式。准备好了吗?让我们继续这段OAuth2的冒险旅程!

踏上这段激动人心的数字探险,我们像探险家一样,揭开了OAuth2协议的神秘面纱,探索了Spring Framework如何巧妙地与它融合。我们穿梭在授权的海洋中,发现了资源所有者、客户端、授权服务器和保护资源服务器这些角色的秘密,它们共同编织了一场华丽的舞会。跟随授权码模式的地图,我们像海盗一样寻找宝藏,一步步解锁了令牌的奥秘。而在简化模式与隐式授权的钢丝上,我们体验了速度与风险的双重游戏。

但这只是冰山一角,我们的旅程才刚刚开始。接下来的路途中,更多未知的挑战和深层的秘密正等着我们去发掘。深入授权模式的迷宫,探索高级安全策略的堡垒,甚至可能遇到一些出人意料的陷阱和难题。系紧你的冒险装备,保持你的好奇心,继续跟随我们的指南针,因为在这段探险的下一个转角,总有新的惊喜在等待着勇敢的你!

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

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

相关文章

2023年西安交通大学校赛(E-雪中楼)

E.雪中楼 如果算出按南北的序列&#xff0c;再转成从低到高的编号序列&#xff0c;岂不是太麻烦了&#xff0c;幸好&#xff0c;没有在这方面费长时间&#xff0c;而是意识到&#xff0c;本质就是要从低到高的编号序列&#xff0c;所以我就按样例模拟了一下&#xff0c;当a[i]0…

为什么AI企业需要联盟营销?

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功。AI工具虽然被越来越多人认可和接受&a…

DETR整体模型结构解析

DETR流程 Backbone用卷积神经网络抽特征。最后通过一层1*1卷积转化到d_model维度fm&#xff08;B,d_model,HW&#xff09;。 position embedding建立跟fm维度相同的位置编码(B&#xff0c;d_model,HW&#xff09;。 Transformer Encoder,V为fm&#xff0c;K&#xff0c;Q为fm…

QT基础初学

目录 1.什么是QT 2.环境搭建 QT SDK的下载 QT的使用 QT构建项目 快捷指令 QT的简单编写 对象树 编码问题 组件 初识信号槽 窗口的释放 窗口坐标体系 1.什么是QT QT 是一个跨平台的 C 图形用户界面库&#xff0c;支持多个系统&#xff0c;用于开发具有图形界面的应…

File name ‘xxxx‘ differs from already included file name ‘xxxx‘ only in casing.

一、报错信息 VSCode报错如下&#xff1a; File name ‘d:/object/oral-data-management/src/components/VisitLogPopup/Info.vue’ differs from already included file name ‘d:/object/oral-data-management/src/components/VisitLogPopup/INfo.vue’ only in casing. The…

AI企业需要“联盟营销”?一文带你探索AI企业营销新玩法!

为什么联盟营销对AI业务有较大优势 联盟营销在电商领域、saas领域与其他产品领域同样有效。在AI业务中&#xff0c;它有效的原因与其他领域大不相同。 高好奇心和试用率 AI领域是创新的热点。它吸引了一群渴望探索和尝试每一项新技术的人群。这种蓬勃的好奇心为聪明的AI企业提…

大模型助力企业提效,九章云极DataCanvas公司联合腾讯搜狗输入法发布私有化解决方案

近日&#xff0c;九章云极DataCanvas公司与腾讯搜狗输入法的合作再次升级。在搜狗输入法开发者中心正式推出之际&#xff0c;九章云极DataCanvas公司作为搜狗输入法的首批开发合作伙伴&#xff0c;双方联合发布“企业知识管理助手”私有化解决方案。 “企业知识管理助手”整体私…

AI虚拟试穿革命:I2VEdit技术引领电商视频内容创新

在当今快速迭代的电子商务领域,用户体验与内容创新是企业竞争力的核心要素。随着AI技术的飞速进步,AI虚拟试穿已不再局限于静态图像,而是迈向了动态视频的新纪元。本文将深入解析一项革新性技术——I2VEdit,如何以其独到之处,为电商尤其是服装零售行业带来一场内容创作与产…

Opencv图像处理技术(图像轮廓)

1图像轮廓概念&#xff1a; 图像轮廓是指图像中连续的像素边界&#xff0c;这些边界通常代表了图像中的物体或者物体的边缘。在数字图像处理中&#xff0c;轮廓是由相同像素值组成的曲线&#xff0c;它们连接相同的颜色或灰度值&#xff0c;并且具有连续性。轮廓可以用来描述和…

【几何】输入0-360度任意的角度,求上面直线与椭圆相切点的坐标计算公式

输入0-360度任意的角度,求上面直线与椭圆相切点的坐标计算公式 使用积分计算 使用到的公式有椭圆公式: x 2 a 2 + y 2 b 2 = 1 \frac{x^2}{a^2}+\frac{y^2}{b^2} = 1 a2x2​+b2y2​=1 平面旋转公式 X r = cos ⁡ θ ∗ ( X s − X O ) − sin ⁡ θ ∗ ( Y s − Y O ) + X …

文心智能体平台:快来创建你的Java学习小助理,全方位辅助学习

文章目录 一、文心智能体平台1.1平台介绍1.2智能体介绍 二、智能体创建三、体验与总结 一、文心智能体平台 文心智能体平台是百度推出的基于文心大模型的智能体&#xff08;Agent&#xff09;平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类…

Three.js 中的场景与相机基础

Three.js 中的场景与相机基础 一、场景&#xff08;Scene&#xff09; 在 Three.js 中&#xff0c;场景是所有 3D 对象存在和交互的容器。艾斯视觉作为行业ui设计与前端开发服务商很高兴能在这里与你共同探讨&#xff1a;它就像是一个虚拟的 3D 空间&#xff0c;我们可以在其中…

[vue3后台管理一]vue3下载安装及环境配置教程

[vue3后台管理二]vue3下载安装element plus 一、vue3下载安装element plus cnpm install element plus二&#xff1a;修改main.js import { createApp } from "vue"; import App from "./App.vue"; import ElementPlus from "element-plus"; …

好用的国产大文件传输软件有哪些,快来看看吧

在这个数字化飞速发展的时代&#xff0c;我们每天都在与各种文件打交道&#xff0c;从简单的文档到庞大的视频素材&#xff0c;文件的体积越来越大&#xff0c;传统的文件传输方式逐渐显得力不从心。面对这个挑战&#xff0c;大文件传输软件应运而生&#xff0c;它们不仅解决了…

Khoj:开源个人AI助手能连接你的在线和本地文档充当你的第二大脑

项目简介 Khoj是一个开源的、个人化的AI助手&#xff0c;旨在充当你的第二大脑。它能够帮助你回答任何问题&#xff0c;不论这些问题是在线上的还是在你自己的笔记中。Khoi 支持使用在线AI模型(例如 GPT-4)或私有、本地的语言模型(例如 Llama3)。你可以选择自托管 Khoj&#x…

自定义tabbar

一: 在这里配置true,则会找根目录下的文件,作为路由渲染到每个tabbar页面下.原本是默认情况,自定义内部路由,放到每个tabbar页面下. 二: 上面做到了,每个tabbar页面的底部都是这个组件. 三: Tabbar 标签栏 - Vant Weapp (youzan.github.io) 使用组件库,配置组件内容. <va…

金融反欺诈指南:车险欺诈为何如此猖獗?

目录 车险欺诈猖獗的原因 车险欺诈的识别难点 多重合作打击车险欺诈 保险企业需要提升反欺诈能力 监管部门需要加强协同合作 青岛市人民检察院在其官方微信公众号上发布的梁某保险诈骗案显示&#xff0c;2020 年以来&#xff0c;某汽修厂负责人梁某、某汽车服务公司负责人孙某&…

pyqt Qtreeview分层控件

pyqt Qtreeview分层控件 介绍效果代码 介绍 QTreeView 是 PyQt中的一个控件&#xff0c;它用于展示分层数据&#xff0c;如目录结构、文件系统等。QTreeView 通常与模型&#xff08;如 QStandardItemModel、QFileSystemModel 或自定义模型&#xff09;一起使用&#xff0c;以管…

2024 GIAC 全球互联网架构大会:拓数派向量数据库 PieCloudVector 架构设计与案例实践

5月24-25日&#xff0c;msup 和高可用架构联合举办了第11届 GIAC 全球互联网架构大会。会议聚焦“共话AI技术的最新进展、架构实践和未来趋势”主题&#xff0c;邀请了 100 余位行业内的领军人物和革新者&#xff0c;分享”Agent/RAG 技术、云原生、基座大模型“等多个热门技术…

07 FreeRTOS 事件组(event group)

1、事件组概念 1.1 基本概念 使用事件组可以等待某个事件、若干事件中的任意一个事件、若干事件中的所有事件&#xff0c;但是不能指定若干事件中的某些事件。 事件组可以简单地认为就是一个整数&#xff1a;这个整数的每一位表示一个事件&#xff1b;每一位事件的含义由程序员…