认证与授权

Mongo 认证提供者

我们提供了一个 `AuthenticationProvider` 的实现,它使用 Vert.x 的 `MongoClient` 对 MongoDB 执行身份验证和授权。

要使用此项目,请将以下依赖项添加到您的构建描述符的依赖项部分

  • Maven(在您的 pom.xml 中)

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-auth-mongo</artifactId>
  <version>5.0.1</version>
</dependency>
  • Gradle(在您的 build.gradle 文件中)

compile 'io.vertx:vertx-auth-mongo:5.0.1'

要创建一个实例,您首先需要一个 `MongoClient` 实例。要了解如何创建它,请查阅 `MongoClient` 的文档。

一旦您获得了 `MongoClient` 实例,就可以按照以下方式创建 `MongoAuthentication` 实例

MongoClient client = MongoClient.createShared(vertx, mongoClientConfig);
MongoAuthenticationOptions options = new MongoAuthenticationOptions();
MongoAuthentication authenticationProvider =
  MongoAuthentication.create(client, options);

一旦您获得了实例,就可以像使用任何 `AuthenticationProvider` 一样对其进行身份验证和授权。

默认配置假定使用名为“user”的集合,用户名存储在“username”字段中,密码存储在“password”字段中。

为了避免用户名的重复,您的“user”集合应在“username”字段上有一个唯一索引。为此,您应该在您的 Mongo 服务器上运行以下代码片段

db.user.createIndex( { username: 1 }, { unique: true } )

您应该添加索引的原因是,由于 Mongo 的特性,先执行查询以验证用户名是否已被占用,然后再插入文档不能作为原子操作运行。使用索引,代码将尝试插入行,如果重复则会失败。

您还可以使用以下任何方法更改 Mongo 集合和列名的所有默认值

如果您想根据您的需求进行调整,可以使用 `setCollectionName`、`setUsernameField`、`setPasswordField`。

默认实现假定密码根据通用 `HashingStrategy` 存储在数据库中(因此盐值存储在哈希中)。

Vert.x Auth JDBC 和 GDPR

GDPR 是欧盟通用法律的一项法规。它取代/凌驾于国家数据保护法律之上,并扩展了之前存在的指令。本手册的这一部分绝不是对该法规的详尽解读,它只是一个简短的总结,说明此组件如何符合要求。不遵守要求的公司可能被处以营业额 4% 或 2000 万欧元的罚款。因此,我们希望确保作为 Vert.x Auth JDBC 的用户,您能够很好地遵守规定。

该法律定义了某些术语

  • 数据主体 - 个人数据被处理的人(例如:用户)

  • 个人数据 - 任何关于可识别或已识别个人的数据

  • 数据处理 - 对个人数据进行的任何操作(手动或自动化)

  • 控制者 - 请求和使用数据的实体(公司)

  • 处理者 - 代表控制者处理数据的任何实体(例如:云服务提供商)

GDPR 定义了以下功能

  • “忘记我” - 擦除权

  • 将个人资料标记为受限 - 限制处理权

  • 导出数据 - 数据可移植权

  • 允许编辑个人资料 - 更正权

  • 查看我的所有数据 - 访问权

  • 同意复选框

  • 年龄检查

  • 数据销毁 - 数据最小化原则

本模块通过不存储有关数据主体的任何可识别信息来遵守 GDPR 法律。唯一的参考是用户名,它不与任何个人数据相关联。

为了将个人数据添加到您的应用程序中,您应该创建自己的数据模式,并使用用户名列作为您数据的参考。一个提示是,您应该有一个布尔标志来将个人数据标记为受限,以遵守限制处理权,这意味着如果您需要处理数据,例如:从邮件列表发送批量电子邮件,如果该标志为真,则不允许这样做。

擦除权并不意味着您必须从应用程序中删除所有记录,例如:在银行中,此权利不能用于擦除正在进行的贷款或债务。您被允许保留您的应用程序数据,但必须擦除个人数据。对于 Vert.x Auth JDBC,您应该删除您的表,但只要无法将用户名链接到个人数据,您仍然可以使用对用户名的引用。

重要提示:这必须在备份后仍然有效!一个建议是备份数据,并在不同的存档上进行数据擦除,以便它们可以单独重放。

认证

使用此实现进行身份验证时,它假定身份验证信息中存在 `username` 和 `password` 字段

Credentials credentials =
  new UsernamePasswordCredentials("tim", "sausages");

authProvider.authenticate(credentials)
  .onSuccess(user -> System.out.println("User: " + user.principal()))
  .onFailure(err -> {
    // Failed!
  });

代替上一个代码片段中使用的 `username` 和 `password` 字段名,您应该使用:`getUsernameCredentialField` 和 `getPasswordCredentialField`

授权 - 权限-角色模型

虽然 Vert.x auth 本身不强制要求任何特定的权限模型(它们只是不透明的字符串),但此实现假定一个熟悉的用户/角色/权限模型,其中一个用户可以拥有零个或多个角色,一个角色可以拥有零个或多个权限。

mongoAuthZ.getAuthorizations(user)
  .onSuccess(v -> {
    if (PermissionBasedAuthorization.create("commit_code").match(user)) {
      // Has permission!
    }
  });

如果验证用户是否具有特定*角色*,那么您只需使用 `RoleBasedAuthorization`。

mongoAuthZ.getAuthorizations(user)
  .onSuccess(v -> {
    if (RoleBasedAuthorization.create("manager").match(user)) {
      // Has role!
    }
  });