数据防泄与最小可见:ABP 统一封装行级安全(RLS)+ 列级脱敏

数据防泄与最小可见:ABP 统一封装行级安全(RLS)+ 列级脱敏

TL;DR:把“谁能看到哪些行字段可见到哪一位”下沉到数据库强制层(PostgreSQL:RLS + 安全视图;SQL Server:RLS + DDM),应用层(ABP + EF Core)只做会话/事务上下文注入、兜底过滤与审计。本版在此前基础上继续打磨:
PGSELECT/INSERT/UPDATE/DELETE 全覆盖策略、customers 同样启/强制 RLS、security_barrier + security_invoker 安全视图、Schema USAGE 最小授权;
MSSQLOrders + Customers 过滤+写阻断(BEFORE/AFTER)SESSION_CONTEXT 统一只读
EF/ABPAsyncLocal 访问器 + 双拦截器(会话兜底 / 事务限定)+ 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…