數據防泄與最小可見:ABP 統一封裝行級安全(RLS)+ 列級脫敏

數據防泄與最小可見:ABP 統一封裝行級安全(RLS)+ 列級脫敏

TL;DR:把“誰能看到哪些行字段可見到哪一位”下沉到數據庫強制層(PostgreSQL:RLS + 安全視圖;SQL Server:RLS + DDM),應用層(ABP + EF Core)只做會話/事務上下文注入、兜底過濾與審計。本版在此前基礎上繼續打磨:
PG ? SELECT/INSERT/UPDATE/DELETE 全覆蓋策略、customers 同樣啟/強制 RLS、security_barrier + security_invoker 安全視圖、Schema USAGE 最小授權;
MSSQL ? Orders + Customers 過濾+寫阻斷(BEFORE/AFTER)SESSION_CONTEXT 統一只讀
EF/ABP ? AsyncLocal 訪問器 + 雙攔截器(會話兜底 / 事務限定)+ TagWith/TagWithCallSite 審計打標;


📚 目錄

  • 數據防泄與最小可見:ABP 統一封裝行級安全(RLS)+ 列級脫敏
    • 0)版本與約定 🧾
    • 1)問題與目標 🎯
      • 總體思路一圖看懂 🗺?
    • 2)職責與架構 🏗?
    • 3)策略 DSL(可選)🧬
    • 4)PostgreSQL 實現(RLS + 安全視圖)🐘
      • 4.1 建表與 **RLS(讀/寫/刪全覆蓋)**
      • 4.2 PG 請求執行流程 🧭
      • 4.3 角色匹配(健壯化)與脫敏函數(STABLE)
      • 4.4 **安全視圖**(最小暴露面 + Schema 權限)
      • 4.5 索引與 SARGable 示例
    • 5)SQL Server 實現(RLS + DDM)🧱
      • 5.1 建表與 DDM
      • 5.2 RLS:**Orders + Customers** 過濾 + **寫阻斷(BEFORE/AFTER)**
      • 5.3 RLS/DDM 工作示意 🧩
      • 5.4 會話上下文注入(統一只讀)
    • 6)ABP / EF Core 集成(生產級)??
      • 6.1 **異步上下文訪問器**(避免單例捕獲作用域對象)
      • 6.2 連接攔截器(會話級兜底)
      • 6.3 事務攔截器(事務級強約束)
      • 6.4 注冊與中間件
      • 6.5 查詢打標與兜底過濾
    • 7)“誰看過什么”審計 🔎
    • 8)性能與容量評測 ?
    • 9)灰度上線與回滾 🧰
    • 10)目錄結構(落盤)📁
    • 11)摘錄 🧪


0)版本與約定 🧾

  • 框架:.NET 8、ABP v8+、EF Core 8
  • 數據庫:PostgreSQL 15+(支持 security_invoker 視圖);SQL Server 2019+(datetime() 脫敏僅 SQL Server 2022+
  • 驅動Npgsql 8.x、Microsoft.Data.SqlClient 5.x
  • 術語:RLS = Row-Level Security;DDM = Dynamic Data Masking

1)問題與目標 🎯

  • 反模式:僅在應用層 WHERE TenantId=... —— 一旦腳本直連/批處理/服務異常,即可能繞過。

  • 目標

    • DB 原生強制:PG 用 RLS + 自定義 GUC + 安全視圖;MSSQL 用 RLS(過濾/阻斷)+ DDM
    • 應用統一注入:ABP/EF 攔截器在連接/事務階段統一注入租戶/用戶/角色上下文。
    • 全鏈路可觀測可評測可灰度與快速回滾

總體思路一圖看懂 🗺?

在這里插入圖片描述


2)職責與架構 🏗?

  • 數據庫層(主防線)

    • PGENABLE RLS + FORCE RLSSELECT/INSERT/UPDATE/DELETE 全覆蓋策略(讀 USING,寫 WITH CHECK);STABLE 函數 + 安全視圖(security_barrier,security_invoker最小授權(僅授視圖 SELECT + Schema USAGE)。
    • MSSQL:RLS = TVF + Security Policy過濾 + 寫阻斷 BEFORE/AFTER);敏感列 DDMsp_set_session_context 只讀
  • 應用層(ABP + EF)

    • DbConnectionInterceptor 會話級注入(兜底)。
    • DbTransactionInterceptor 事務級注入 set_config(..., true)(避免連接池“串味”)。
    • EF 全局過濾器僅作兜底(軟刪/租戶),不替代 RLS。
    • 審計TagWith/TagWithCallSite 打標 + 采樣事件(User/Tenant/Entity/Key/TraceId)。

3)策略 DSL(可選)🧬

# policies/tenants.yml
tenants:- id: "t1"roles:- name: "auditor"rls:Orders: "tenant_id = current_tenant()"masking:Customers.phone: "last4"Customers.email: "email"- name: "csr"rls:Orders: "tenant_id = current_tenant() AND region = current_region()"masking:Customers.phone: "partial(0,'****-',4)"

生成器輸出:PG 的 CREATE POLICY/函數/視圖與 MSSQL 的 TVF/CREATE SECURITY POLICY/ALTER ... MASKED,并生成 ABP 常量 & 遷移。


4)PostgreSQL 實現(RLS + 安全視圖)🐘

4.1 建表與 RLS(讀/寫/刪全覆蓋)

CREATE EXTENSION IF NOT EXISTS pgcrypto;CREATE TABLE public.customers(id        uuid PRIMARY KEY DEFAULT gen_random_uuid(),tenant_id uuid NOT NULL,name      text NOT NULL,phone     text NOT NULL,email     text NOT NULL
);CREATE TABLE public.orders(id          uuid PRIMARY KEY DEFAULT gen_random_uuid(),tenant_id   uuid NOT NULL,customer_id uuid NOT NULL REFERENCES public.customers(id),region      text,amount      numeric(12,2) NOT NULL
);-- 兩表啟用并強制 RLS(避免直查/誤授)
ALTER TABLE public.customers ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.customers FORCE ROW LEVEL SECURITY;
ALTER TABLE public.orders    ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.orders    FORCE ROW LEVEL SECURITY;-- customers:讀策略(若允許寫/刪,照 orders 同步補齊 WITH CHECK/DELETE)
CREATE POLICY customers_select_tenant
ON public.customers
AS PERMISSIVE
FOR SELECT
USING (tenant_id = current_setting('app.tenant_id', true)::uuid);-- orders:讀策略
CREATE POLICY orders_select_tenant
ON public.orders
AS PERMISSIVE
FOR SELECT
USING (tenant_id = current_setting('app.tenant_id', true)::uuid);-- orders:寫策略(INSERT)
CREATE POLICY orders_insert_tenant
ON public.orders
AS PERMISSIVE
FOR INSERT
WITH CHECK (tenant_id = current_setting('app.tenant_id', true)::uuid);-- orders:寫策略(UPDATE)
CREATE POLICY orders_update_tenant
ON public.orders
AS PERMISSIVE
FOR UPDATE
USING      (tenant_id = current_setting('app.tenant_id', true)::uuid)
WITH CHECK (tenant_id = current_setting('app.tenant_id', true)::uuid);-- orders:刪策略(DELETE)
CREATE POLICY orders_delete_tenant
ON public.orders
AS PERMISSIVE
FOR DELETE
USING (tenant_id = current_setting('app.tenant_id', true)::uuid);

4.2 PG 請求執行流程 🧭

👤 調用方🧩 應用(ABP/EF)🔌 Npgsql/EF🗄? PostgreSQL發起請求打開連接/開始事務set_config('app.*', ..., true)SELECT/INSERT/UPDATE/DELETERLS 評估 (USING/WITH CHECK/DELETE)安全視圖 + 脫敏函數? 返回可見+脫敏后的結果? RLS 拒絕 (ERROR)alt[命中本租戶][跨租戶寫或讀越權]返回響應👤 調用方🧩 應用(ABP/EF)🔌 Npgsql/EF🗄? PostgreSQL

4.3 角色匹配(健壯化)與脫敏函數(STABLE)

-- 角色精確匹配:忽略大小寫與空白
CREATE OR REPLACE FUNCTION public.has_role(role_name text)
RETURNS boolean
LANGUAGE sql STABLE
AS $$SELECT lower(role_name) = ANY (regexp_split_to_array(coalesce(lower(current_setting('app.roles', true)), ''),'\s*,\s*'))
$$;CREATE OR REPLACE FUNCTION public.mask_phone(p text)
RETURNS text
LANGUAGE sql STABLE
AS $$SELECT CASE WHEN public.has_role('auditor') THEN pELSE '****-' || right(p, 4) END
$$;

4.4 安全視圖(最小暴露面 + Schema 權限)

-- PG15+:security_barrier 防謂詞下推探查;security_invoker 以調用者權限/RLS 評估
CREATE OR REPLACE VIEW public.v_customers
WITH (security_barrier = true, security_invoker = true) AS
SELECT id, name, mask_phone(phone) AS phone_masked, email
FROM public.customers;-- 權限最小化:僅授予視圖讀取,回收底表 & 授予 schema USAGE
REVOKE ALL ON TABLE public.customers FROM PUBLIC;
GRANT USAGE ON SCHEMA public TO app_reader;
GRANT SELECT ON public.v_customers TO app_reader;

4.5 索引與 SARGable 示例

-- 典型多租戶復合索引(忽略已存在校驗/CONCURRENTLY 視運維)
CREATE INDEX idx_orders_tenant_region ON public.orders(tenant_id, region);

5)SQL Server 實現(RLS + DDM)🧱

5.1 建表與 DDM

CREATE SCHEMA sec;CREATE TABLE dbo.Customers(Id         uniqueidentifier NOT NULL DEFAULT NEWID() PRIMARY KEY,Tenant_Id  uniqueidentifier NOT NULL,Name       nvarchar(200) NOT NULL,Phone      nvarchar(32)  NOT NULL MASKED WITH (FUNCTION='partial(0,"****-",4)'),Email      nvarchar(256) NOT NULL MASKED WITH (FUNCTION='email()')-- SQL Server 2022+:可對 datetime 列用 FUNCTION='datetime()'
);CREATE TABLE dbo.Orders(Id          uniqueidentifier NOT NULL DEFAULT NEWID() PRIMARY KEY,Tenant_Id   uniqueidentifier NOT NULL,Customer_Id uniqueidentifier NOT NULL REFERENCES dbo.Customers(Id),Region      nvarchar(64) NULL,Amount      decimal(12,2) NOT NULL
);

5.2 RLS:Orders + Customers 過濾 + 寫阻斷(BEFORE/AFTER)

-- 通用過濾謂詞(讀可見性)
CREATE OR ALTER FUNCTION sec.fn_tenant_filter(@tenant_id uniqueidentifier)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN SELECT 1 AS fn_result
WHERE @tenant_id = TRY_CONVERT(uniqueidentifier, SESSION_CONTEXT(N'tenant_id'));-- 通用阻斷謂詞(防跨租戶寫入)
CREATE OR ALTER FUNCTION sec.fn_tenant_block(@tenant_id uniqueidentifier)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN SELECT 1 AS fn_result
WHERE @tenant_id = TRY_CONVERT(uniqueidentifier, SESSION_CONTEXT(N'tenant_id'));-- 單個策略統一管控兩張表(Add 多條謂詞)
CREATE SECURITY POLICY sec.tenant_policy
ADD FILTER PREDICATE sec.fn_tenant_filter(Tenant_Id) ON dbo.Orders,
ADD FILTER PREDICATE sec.fn_tenant_filter(Tenant_Id) ON dbo.Customers,
ADD BLOCK  PREDICATE sec.fn_tenant_block(Tenant_Id)  ON dbo.Orders    AFTER  INSERT,
ADD BLOCK  PREDICATE sec.fn_tenant_block(Tenant_Id)  ON dbo.Orders    AFTER  UPDATE,
ADD BLOCK  PREDICATE sec.fn_tenant_block(Tenant_Id)  ON dbo.Orders    BEFORE UPDATE,
ADD BLOCK  PREDICATE sec.fn_tenant_block(Tenant_Id)  ON dbo.Orders    BEFORE DELETE,
ADD BLOCK  PREDICATE sec.fn_tenant_block(Tenant_Id)  ON dbo.Customers AFTER  INSERT,
ADD BLOCK  PREDICATE sec.fn_tenant_block(Tenant_Id)  ON dbo.Customers AFTER  UPDATE,
ADD BLOCK  PREDICATE sec.fn_tenant_block(Tenant_Id)  ON dbo.Customers BEFORE UPDATE,
ADD BLOCK  PREDICATE sec.fn_tenant_block(Tenant_Id)  ON dbo.Customers BEFORE DELETE
WITH (STATE = ON);

5.3 RLS/DDM 工作示意 🧩

在這里插入圖片描述

5.4 會話上下文注入(統一只讀)

EXEC sys.sp_set_session_context @key=N'tenant_id', @value=@TenantId,  @read_only=1;
EXEC sys.sp_set_session_context @key=N'roles',     @value=@CsvRoles,  @read_only=1;

限制:帶 Security Policy 的表不能創建索引視圖。匯總/分析用列存/覆蓋索引或只讀物化層(ETL/CDC)。


6)ABP / EF Core 集成(生產級)??

6.1 異步上下文訪問器(避免單例捕獲作用域對象)

public interface ITenantContextAccessor
{string? TenantId { get; }string? UserId { get; }IReadOnlyList<string> Roles { get; }IDisposable Use(string? tenantId, string? userId, IEnumerable<string> roles);
}public sealed class TenantContextAccessor : ITenantContextAccessor
{private sealed class Holder{public string? TenantId { get; init; }public string? UserId { get; init; }public IReadOnlyList<string> Roles { get; init; } = Array.Empty<string>();}private static readonly AsyncLocal<Holder?> _current = new();public string? TenantId => _current.Value?.TenantId;public string? UserId   => _current.Value?.UserId;public IReadOnlyList<string> Roles => _current.Value?.Roles ?? Array.Empty<string>();public IDisposable Use(string? tenantId, string? userId, IEnumerable<string> roles){var prev = _current.Value;_current.Value = new Holder { TenantId = tenantId, UserId = userId, Roles = roles.ToArray() };return new DisposableAction(() => _current.Value = prev);}private sealed class DisposableAction : IDisposable{private readonly Action _a; public DisposableAction(Action a) => _a = a;public void Dispose() => _a();}
}

中間件在請求首/尾 using accessor.Use(...) 設置/清理上下文,使單例攔截器安全讀取。

6.2 連接攔截器(會話級兜底)

using System.Data.Common;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Npgsql;public sealed class TenantSessionContextInterceptor : DbConnectionInterceptor
{private readonly ITenantContextAccessor _ctx;public TenantSessionContextInterceptor(ITenantContextAccessor ctx) => _ctx = ctx;public override async Task ConnectionOpenedAsync(DbConnection connection, ConnectionEndEventData eventData, CancellationToken token = default){if (_ctx.TenantId is null) return;if (connection is NpgsqlConnection){await using var cmd = connection.CreateCommand();cmd.CommandText = @"SET app.tenant_id = @tenant;SET app.user_id   = @user;SET app.roles     = @roles;";var p1 = cmd.CreateParameter(); p1.ParameterName = "tenant"; p1.Value = _ctx.TenantId!;var p2 = cmd.CreateParameter(); p2.ParameterName = "user";   p2.Value = _ctx.UserId ?? "";var p3 = cmd.CreateParameter(); p3.ParameterName = "roles";  p3.Value = string.Join(',', _ctx.Roles);cmd.Parameters.Add(p1); cmd.Parameters.Add(p2); cmd.Parameters.Add(p3);await cmd.ExecuteNonQueryAsync(token);}else // SQL Server{await using var cmd = connection.CreateCommand();cmd.CommandText ="EXEC sys.sp_set_session_context @key=N'tenant_id', @value=@TenantId, @read_only=1; " +"EXEC sys.sp_set_session_context @key=N'roles',     @value=@Roles,     @read_only=1;";var p1 = cmd.CreateParameter(); p1.ParameterName = "TenantId"; p1.Value = _ctx.TenantId!;var p2 = cmd.CreateParameter(); p2.ParameterName = "Roles";    p2.Value = string.Join(',', _ctx.Roles);cmd.Parameters.Add(p1); cmd.Parameters.Add(p2);await cmd.ExecuteNonQueryAsync(token);}}public override async Task ConnectionClosingAsync(DbConnection connection, ConnectionEventData eventData, CancellationToken token = default){if (connection is NpgsqlConnection){await using var cmd = connection.CreateCommand();cmd.CommandText = "RESET app.tenant_id; RESET app.user_id; RESET app.roles;";await cmd.ExecuteNonQueryAsync(token);}}
}

6.3 事務攔截器(事務級強約束)

using System.Data.Common;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Npgsql;public sealed class TenantTransactionContextInterceptor : DbTransactionInterceptor
{private readonly ITenantContextAccessor _ctx;public TenantTransactionContextInterceptor(ITenantContextAccessor ctx) => _ctx = ctx;public override async Task TransactionStartedAsync(DbTransaction transaction, TransactionEndEventData eventData, CancellationToken cancellationToken = default){if (transaction.Connection is NpgsqlConnection && _ctx.TenantId is not null){await using var cmd = transaction.Connection.CreateCommand();cmd.Transaction = transaction;cmd.CommandText = @"SELECTset_config('app.tenant_id', @tenant, true),set_config('app.user_id',   @user,   true),set_config('app.roles',     @roles,  true);";var p1 = cmd.CreateParameter(); p1.ParameterName = "tenant"; p1.Value = _ctx.TenantId!;var p2 = cmd.CreateParameter(); p2.ParameterName = "user";   p2.Value = _ctx.UserId ?? "";var p3 = cmd.CreateParameter(); p3.ParameterName = "roles";  p3.Value = string.Join(',', _ctx.Roles);cmd.Parameters.Add(p1); cmd.Parameters.Add(p2); cmd.Parameters.Add(p3);await cmd.ExecuteNonQueryAsync(cancellationToken);}}
}

6.4 注冊與中間件

// Program.cs / Module.ConfigureServices
services.AddSingleton<ITenantContextAccessor, TenantContextAccessor>();
services.AddSingleton<TenantSessionContextInterceptor>();
services.AddSingleton<TenantTransactionContextInterceptor>();services.AddAbpDbContext<AppDbContext>((sp, options) =>
{options.AddInterceptors(sp.GetRequiredService<TenantSessionContextInterceptor>(),sp.GetRequiredService<TenantTransactionContextInterceptor>());
});// 中間件(示意):從 ABP/Claims 取租戶/用戶/角色并設置異步上下文
app.Use(async (http, next) =>
{var accessor = http.RequestServices.GetRequiredService<ITenantContextAccessor>();var tenantId = /* 從 ABP IMultiTenancy/Claims 取 */;var userId   = /* 從 ClaimsPrincipal 取 */;var roles    = /* 從 Claims/ABP Role 取 */;using (accessor.Use(tenantId, userId, roles)){await next();}
});

6.5 查詢打標與兜底過濾

var items = await _db.Orders.TagWith("PII:Customers").TagWithCallSite() // 可選:自動帶上調用文件與行號,利于溯源.Where(x => x.TenantId == CurrentTenantId) // 兜底;生產以 RLS 為準.ToListAsync();

7)“誰看過什么”審計 🔎

TagWith/CallSite/TraceId
失敗/拒絕也采樣
PG: pgaudit
MSSQL: Audit/Extended Events
🧪 查詢/變更
📋 應用側審計采樣
📈 ABP 后臺面板
(表格/時間軸/導出/告警)
🗄? 數據庫審計
🧾 安全日志/文件/SIEM
🛠? 安全/運營處置
  • PG:啟用 pgauditshared_preload_libraries='pgaudit'),pgaudit.log='read,write'
  • MSSQL:配置 SERVER AUDIT + DATABASE AUDIT SPECIFICATION,記錄 SELECT/對象訪問到文件/安全日志。
  • 應用采樣:記錄 (User,Tenant,Entity,Key,Purpose,TraceId,Time);后臺提供檢索/導出/告警。

8)性能與容量評測 ?

  • 謂詞可搜索(SARGable):RLS 表達式命中索引,避免在列上包函數/計算。

  • 索引策略

    • PG/MSSQL:為 tenant_id、常用維度(如 region)建復合索引;
    • MSSQL:不要在帶 RLS 的表上建索引視圖(不兼容);改用列存/覆蓋索引或只讀物化層。
  • 視圖代價security_barrier 限制謂詞下推,熱點查詢可為可信后端提供直查接口(嚴格授權)。

  • 基準建議

    • PG:pgbench 對比 RLS ON/OFF;
    • MSSQL:Extended Events + Query Store,關注計劃重用、回表率、p50/p95/p99、CPU。

9)灰度上線與回滾 🧰

通過
異常
🧪 開發/測試
🌗 影子發布
(PG: ENABLE 不 FORCE / MSSQL: STATE=OFF)
🔍 鏡像/對比/基準
🌈 灰度開啟
(按租戶/業務線)
🐘 PG: FORCE RLS
🧱 MSSQL: STATE=ON
📊 觀測與回歸
? 回滾
PG: DISABLE RLS
MSSQL: STATE=OFF
  • CI 門禁:DSL/SQL golden tests(允許/拒絕矩陣)+ 靜態檢查禁止對含 SECURITY POLICY 的表創建索引視圖。

10)目錄結構(落盤)📁

abp-data-min-visibility/modules/Abp.DataVisibility/            # ABP 模塊:攔截器、審計擴展、策略加載db/pg/rls/*.sql                   # PG:RLS/視圖/函數mssql/rls/*.sql                # MSSQL:TVF/Policy/DDMtests/integration/                   # xUnit:允許/拒絕用例(golden)dashboards/audit-app/                     # ABP 后臺審計面板tools/policyc/                       # DSL → SQL/ABP 常量 生成器(可選)

11)摘錄 🧪

PostgreSQL

BEGIN;
SELECT set_config('app.tenant_id','00000000-0000-0000-0000-000000000001', true);
SELECT set_config('app.roles','csr', true);-- 僅返回本租戶
SELECT * FROM public.orders;-- 跨租戶寫:應被 WITH CHECK 攔截
INSERT INTO public.orders(tenant_id, customer_id, amount)
VALUES ('00000000-0000-0000-0000-000000000002', gen_random_uuid(), 10.00); -- 期望失敗-- 跨租戶刪:應被 DELETE USING 策略攔截
DELETE FROM public.orders WHERE tenant_id='00000000-0000-0000-0000-000000000002'; -- 期望失敗-- 視圖脫敏
SELECT id, phone_masked FROM public.v_customers;
COMMIT;

SQL Server

DECLARE @TenantId uniqueidentifier = '00000000-0000-0000-0000-000000000001';
EXEC sys.sp_set_session_context @key=N'tenant_id', @value=@TenantId,  @read_only=1;
EXEC sys.sp_set_session_context @key=N'roles',     @value=N'csr',      @read_only=1;-- 僅本租戶訂單/客戶可見
SELECT * FROM dbo.Orders;
SELECT * FROM dbo.Customers;-- 跨租戶寫:應被 BLOCK PREDICATE 攔截(AFTER/BEFORE)
INSERT INTO dbo.Orders (Tenant_Id, Customer_Id, Amount)
VALUES ('00000000-0000-0000-0000-000000000002', NEWID(), 10.00); -- 期望失敗-- DDM 脫敏效果
SELECT Phone, Email FROM dbo.Customers;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94948.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94948.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡編程 04:TCP連接,客戶端與服務器的區別,實現 TCP 聊天及文件上傳,Tomcat 的簡單使用

一、概述 記錄時間 [2025-08-29] 前置文章&#xff1a; 網絡編程 01&#xff1a;計算機網絡概述&#xff0c;網絡的作用&#xff0c;網絡通信的要素&#xff0c;以及網絡通信協議與分層模型 網絡編程 02&#xff1a;IP 地址&#xff0c;IP 地址的作用、分類&#xff0c;通過 …

最小生成樹——Kruskal

標題什么是生成樹&#xff1f; 對于一張無向圖&#xff0c;由nnn個頂點和n?1n-1n?1條邊構成地聯通子圖&#xff0c;叫做這個無向圖 生成樹 最小生成樹就是指邊權之和最小的生成樹 如何求最小生成樹&#xff1f; Kruskal 介紹: 存圖時只存每條邊地起點、終點&#xff0c;…

ADFS 和 OAuth 的區別

ADFS 和 OAuth 的區別 ADFS(Active Directory Federation Services)和 OAuth 都是身份認證與授權領域的技術,但它們的設計目標、應用場景和實現方式有顯著區別。以下從核心定義、技術特性、應用場景等方面詳細對比: 核心定義與設計目標 技術 核心定義 設計目標 ADFS 微軟…

神經網絡參數量計算詳解

1. 神經網絡參數量計算基本原理 1.1 什么是神經網絡參數 神經網絡的參數主要包括&#xff1a; 權重&#xff08;Weights&#xff09;&#xff1a;連接不同神經元之間的權重矩陣偏置&#xff08;Bias&#xff09;&#xff1a;每個神經元的偏置項批歸一化參數&#xff1a;BatchNo…

手寫鏈路追蹤

1. 什么是鏈路追蹤 鏈路追蹤是指在分布式系統中&#xff0c;將一次請求的處理過程進行記錄并聚合展示的一種方法。目的是將一次分布式請求的調用情況集中在一處展示&#xff0c;如各個服務節點上的耗時、請求具體到達哪臺機器上、每個服務節點的請求狀態等。這樣就可以輕松了解…

從零開始的python學習——常量與變量

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;python學習專欄&#xff1b; 文章目錄 前言 一、常量和表達式 二、變量類型 2.1、什么是變量 2.2、變量語法 &#xff08;1&a…

基于51單片機環境監測設計 光照 PM2.5粉塵 溫濕度 2.4G無線通信

1 系統功能介紹 本設計是一套 基于51單片機的環境監測系統&#xff0c;能夠實時采集環境光照、PM2.5、溫濕度等參數&#xff0c;并通過 2.4G無線模塊 NRF24L01 實現數據傳輸。系統具備本地顯示與報警功能&#xff0c;可通過按鍵設置各類閾值和時間&#xff0c;方便用戶進行環境…

【Flask】測試平臺開發,產品管理實現添加功能-第五篇

概述在前面的幾篇開發文章中&#xff0c;我們只是讓數據在界面上進行了展示&#xff0c;但是沒有添加按鈕的功能&#xff0c;接下來我們需要開發一個添加的按鈕&#xff0c;用戶產品功能的創建和添加抽公共數據鏈接方法添加接口掌握post實現和請求數據處理前端掌握Button\Dilog…

循環高級(2)

6.練習3 打印九九乘法表7.練習3 制表符詳解對齊不了原因&#xff1a;name補到8zhangsan本身就是8&#xff0c;補完就變成16解決辦法&#xff1a;1.去掉zhangsan\t,這樣前后都是82.name后面加2個\t加一個\t&#xff0c;name\t就是占8個&#xff0c;再加一個\t&#xff0c;就變成…

盒馬生鮮 小程序 逆向分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 部分python代碼 params {&…

【Linux系統】線程控制

1. POSIX線程庫 (pthreads)POSIX線程&#xff08;通常稱為pthreads&#xff09;是IEEE制定的操作系統線程API標準。Linux系統通過glibc庫實現了這個標準&#xff0c;提供了創建和管理線程的一系列函數。核心特性命名約定&#xff1a;絕大多數函數都以 pthread_ 開頭&#xff0c…

【Spring Cloud Alibaba】前置知識

【Spring Cloud Alibaba】前置知識1. 微服務介紹1.1 系統架構的演變1.1.1 單體應用架構1.1.2 垂直應用架構1.1.3 分布式架構1.1.3.1 SOA架構1.1.4 微服務架構1. 微服務介紹 1.1 系統架構的演變 隨著互聯網的發展&#xff0c;網站應用的規模也在不斷的擴大&#xff0c;進而導致…

2025互聯網大廠Java面試1000道題目及參考答案

Java學到什么程度可以面試工作&#xff1f; 要達到能夠面試Java開發工作的水平&#xff0c;需要掌握以下幾個方面的知識和技能&#xff1a; 1. 基礎扎實&#xff1a;熟悉Java語法、面向對象編程概念、異常處理、I/O流等基礎知識。這是所有Java開發者必備的基礎&#xff0c;也…

記錄:HSD部署(未完成)

建數據庫 相關文檔&#xff1a;Confluence準備&#xff1a;CA文件和備份用的aws key。 CA文件&#xff1a;在namespace添加trust-injectionenabled的標簽&#xff0c;會自動生成。 aws key&#xff1a;生成cnpg-backup-creds的secret。安裝&#xff1a; 從git倉庫獲取values模…

【AI】提示詞與自然語言處理:從NLP視角看提示詞的作用機制

提示詞與自然語言處理&#xff1a;從 NLP 視角看提示詞的作用機制在人工智能快速發展的今天&#xff0c;大模型成為了人們關注的焦點。而要讓大模型更好地理解人類意圖、完成各種任務&#xff0c;提示詞扮演著關鍵角色。從自然語言處理&#xff08;NLP&#xff09;的角度來看&a…

2025.8.29機械臂實戰項目

好久沒給大家更新了&#xff0c;上周末大學大四開學&#xff0c;所以停更了幾天&#xff0c;回來后在做項目&#xff0c;接下來的幾篇文章&#xff0c;給大家帶來幾個項目&#xff0c;第一個介紹的是機械臂操作&#xff0c;說是機械臂操作&#xff0c;簡單來說&#xff0c;就是…

【機器學習基礎】機器學習的要素:任務T、性能度量P和經驗E

第一章 機器學習的本質與理論框架 機器學習作為人工智能領域的核心支柱,其理論基礎可以追溯到20世紀中葉的統計學習理論。Tom Mitchell在其1997年的經典著作《Machine Learning》中給出了一個至今仍被廣泛引用的學習定義:"對于某類任務T和性能度量P,一個計算機程序被認…

wav音頻轉C語言樣點數組

WAV to C Header Converter 將WAV音頻文件轉換為C語言頭文件的Python腳本&#xff0c;支持將音頻數據嵌入到C/C項目中。 功能特性 音頻格式支持 PCM格式&#xff1a;支持8位、16位、24位、32位PCM音頻IEEE Float格式&#xff1a;支持32位浮點音頻多聲道&#xff1a;支持單聲道、…

01.《基礎入門:了解網絡的基本概念》

網絡基礎 文章目錄網絡基礎網絡通信核心原理網絡通信定義信息傳遞過程關鍵術語解釋網絡的分類網絡參考模型OSI 參考模型各層核心工作分層核心原則TCP/IP 參考模型&#xff08;4 層 / 5 層&#xff0c;實際應用模型&#xff09;TCP/IP 與 OSI 模型的對應關系傳輸層核心協議&…

基于vue駕校管理系統的設計與實現5hl93(程序+源碼+數據庫+調試部署+開發環境)帶論文文檔1萬字以上,文末可獲取,系統界面在最后面。

系統程序文件列表&#xff1a;項目功能&#xff1a;學員,教練,教練信息,預約信息,場地信息,時間安排,車輛信息,預約練車,時間段,駕校場地信息,駕校車輛信息,預約報名開題報告內容&#xff1a;一、選題背景與意義背景隨著汽車保有量持續增長&#xff0c;駕校行業規模不斷擴大&am…