项目

GDPR模块(专业版)

使用此模块需持有ABP团队版或更高级别许可

该模块允许用户下载和删除应用程序收集的个人数据。

GDPR模块向引用Volo.Abp.Gdpr.Abstractions包的其他模块请求信息,并将响应数据合并为单个JSON文件,用户可后续下载个人数据。同时,用户可永久删除其个人数据和账户。

模块功能概览请参阅模块描述页

安装指南

GDPR模块已预安装在 分层 Web 应用模板单层Web应用模板 中,无需手动安装。

如需手动安装,可通过两种方式实现:

  • 通过ABP CLI: 在解决方案文件夹(包含*.sln文件的目录)中打开命令行终端,执行以下命令:
abp add-module Volo.Gdpr
  • 通过ABP Suite: 运行ABP Suite,选择项目后进入顶部菜单的模块页面,找到GDPR卡片并点击**添加为项目(含源代码)添加为包(不含源代码)**按钮将模块添加到项目中。

包组成

本模块遵循模块开发最佳实践指南,包含多个NuGet和NPM包。如需了解包结构及其关联关系,请参阅该指南。

可访问Gdpr模块包列表页面查看相关包列表。

用户界面

菜单项

GDPR模块在"用户"资料菜单中添加以下项目:

  • 个人数据:个人数据管理页面。可请求个人数据、列出所有个人数据请求、下载/删除个人数据,以及永久删除账户。

gdpr菜单

GdprMenus类中定义了该菜单项名称的常量变量。

页面功能

个人数据页面

"个人数据"页面用于管理个人数据请求。可查看历史请求、当前最新请求状态、创建新请求、下载数据或永久删除所有个人数据及账户。

gdpr页面

GDPR模块专为分布式架构设计。当用户请求个人数据时,模块会发布两个事件:

  • GdprUserDataRequestedEto:触发个人数据收集器准备用户数据
  • GdprUserDataDeletionRequestedEto:触发个人数据收集器删除用户数据

您可订阅这些事件,在自定义模块中实现数据收集和删除逻辑。详见分布式事件章节。

查看GDPR模块其他功能,请访问模块描述页

配置选项

AbpGdprOptions

可在模块的ConfigureServices方法中配置AbpGdprOptions

Configure<AbpGdprOptions>(options =>
{
    //在此设置选项...
});

AbpGdprOptions属性:

  • RequestTimeInterval(默认:1天):设置允许的请求时间间隔。可根据需要调整个人数据请求频率,默认用户每天可请求一次个人数据。
  • MinutesForDataPreparation(默认:60分钟):由于GDPR模块支持分布式场景,收集和准备个人数据需要时间。可根据应用规模调整数据准备时长。

AbpCookieConsentOptions

用于配置Cookie同意功能,可在模块的ConfigureServices方法中配置:

Configure<AbpCookieConsentOptions>(options => 
{
    IsEnabled = true;
    CookiePolicyUrl = "/CookiePolicy";
    PrivacyPolicyUrl = "/PrivacyPolicy";
    Expiration = TimeSpan.FromDays(180);
});

AbpCookieConsentOptions属性:

  • IsEnabled(默认:false):启用或禁用Cookie同意功能。
  • CookiePolicyUrl:定义Cookie政策页面URL。设置后,Cookie同意声明中会自动添加"Cookie政策"链接,用户可在接受前查看政策。支持本地地址(如/CookiePolicy)或完整URL(如https://example.com/cookie-policy)。
  • PrivacyPolicyUrl:定义隐私政策页面URL。设置后,Cookie同意声明中会自动添加"隐私政策"链接。支持本地地址(如/PrivacyPolicy)或完整URL。
  • Expiration:定义Cookie同意的过期时间。默认接受同意后会设置.AspNet.Consentcookie,有效期6个月。

内部实现

领域层

聚合体

本模块遵循实体最佳实践与规范

GdprRequest

GDPR请求的主聚合根。存储请求的通用信息及从其他模块收集的GdprInfo(个人数据)列表。

  • GdprRequest(聚合根):表示用户发起的GDPR请求。
    • UserId:发起请求的用户ID。
    • ReadyTime:数据准备过程的截止时间。根据AbpGdprOptionsMinutesForDataPreparation属性与请求创建时间计算得出。
    • Info(集合):包含收集的用户个人数据。

实体

GdprInfo

用于存储从模块/提供程序收集的数据。

  • GdprInfo(实体):表示用户的个人数据。
    • RequestId:GDPR请求ID。
    • Data:存储个人数据。
    • Provider:指示收集个人数据的模块。

存储库

本模块遵循存储库最佳实践与规范

为模块定义了以下自定义存储库:

  • IGdprRequestRepository

事件处理器

GdprUserDataEventHandler

由应用中的个人数据提供程序触发。将收集的数据保存至数据库。

应用层

应用服务

  • GdprRequestAppService(实现IGdprRequestAppService):实现个人数据页面的用例逻辑。

数据库支持

通用配置

表/集合前缀与模式

如需修改表前缀或设置模式名称(如果数据库提供程序支持),可设置GdprDbProperties类的静态属性。

连接字符串

本模块使用AbpGdpr作为连接字符串名称。如未定义该名称的连接字符串,将回退到Default连接字符串。

详见连接字符串文档。

Entity Framework Core / MongoDB

表/集合
  • AbpGdprRequests
  • AbpGdprInfos
实体关系

实体关系图

Angular UI

安装配置

要将应用配置为使用gdpr模块,首先需要从@volo/abp.ng.gdpr/config导入provideGdprConfig,然后将其添加到appConfig数组:

// app.config.ts
import {
  provideGdprConfig,
  withCookieConsentOptions,
} from '@volo/abp.ng.gdpr/config';

export const appConfig: ApplicationConfig = {
  providers: [
    provideGdprConfig(
      withCookieConsentOptions({
        cookiePolicyUrl: '/gdpr-cookie-consent/cookie',
        privacyPolicyUrl: '/gdpr-cookie-consent/privacy',
      }),
    ),
  ],
};

gdpr模块应在路由数组中通过懒加载导入。可通过静态方法createRoutes进行配置,可用选项如下。可从@volo/abp.ng.gdpr导入:

// app.routes.ts
const APP_ROUTES: Routes = [
  // 其他路由定义
  {
    path: 'gdpr',
    loadChildren: () =>
      import('@volo/abp.ng.gdpr').then(c => c.createRoutes(/* 在此添加选项 */)),
  },
];

如果通过启动模板生成项目,则无需额外配置,因为相关文件已预先配置完成。

配置选项

可通过向createRoutes静态方法传递以下选项来修改模块页面的外观和行为:

分布式事件

GDPR模块采用异步数据收集机制,兼容微服务解决方案。用户请求信息时会发布事件。

GdprUserDataRequestedEto

发布此事件传输对象 以触发所有个人数据收集器开始准备数据。如需为模块收集个人数据,需订阅此ETO类,并发布包含已收集数据的GdprUserDataPreparedEto事件。

GdprUserDataPreparedEto

事件传输对象用于将收集的个人数据按模块保存为独立JSON文件。通常无需实现此事件处理器,因为模块已内置实现,会将收集的数据以压缩包形式返回,内含多个JSON文件,每个文件包含来自特定模块的数据。

GdprUserDataDeletionRequestedEto

当用户请求永久删除个人数据和账户时发布此 事件传输对象 。默认仅 身份认证专业模块 中的IdentityGdprEventHandler会订阅此事件,对用户数据进行匿名化处理并删除账户(默认使用软删除,除非另行配置)。

如需删除其他模块中存储的敏感用户数据,可订阅此事件并在相应模块中实现自定义删除(或匿名化)逻辑。

Cookie同意功能

Cookie同意功能可在保存用户特定数据前,向应用用户进行告知提示。

该功能默认在 分层 Web 应用单层 Web 应用 启动模板中启用。通过配置 AbpCookieConsentOptions 可轻松启用/禁用Cookie同意提示。

如需自定义Cookie同意组件中的文本,只需在本地化资源文件中定义以下本地化键并修改内容:

    "本网站使用Cookie": "本网站使用Cookie以确保您获得最佳网站体验。",
    "Cookie同意接受政策": "若继续浏览,即表示您同意我们的{0}和{1}。",
    "Cookie同意接受单一政策": "若继续浏览,即表示您同意我们的{0}。",

关于定义本地化资源和覆盖预构建模块本地化条目的更多信息,请参阅本地化文档

配置Cookie同意

在应用中启用Cookie同意需完成两个步骤:

1. 在模块类的ConfigureServices方法中配置服务:

context.Services.AddAbpCookieConsent(options =>
{
    options.IsEnabled = true;
    options.CookiePolicyUrl = "/CookiePolicy";
    options.PrivacyPolicyUrl = "/PrivacyPolicy";
});

2. 在请求管道中添加中间件(在OnApplicationInitialization方法中):

public override void OnApplicationInitialization(ApplicationInitializationContenxt context)
{
        var app = context.GetApplicationBuilder();
        //...
 
+       app.UseAbpCookieConsent();
        app.UseCorrelationId();
        app.UseRouting();
        app.MapAbpStaticAssets();
        app.UseAbpSecurityHeaders();
        app.UseAuthentication();

        //...
}

配置完成后,页面底部将显示Cookie同意横幅,其中包含指向《Cookie政策》和《隐私政策》的链接,有助于告知用户并支持GDPR合规要求。

在本文档中