<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-auth-mongo</artifactId>
<version>5.0.1</version>
</dependency>
Mongo 认证提供者
我们提供了一个 `AuthenticationProvider` 的实现,它使用 Vert.x 的 `MongoClient` 对 MongoDB 执行身份验证和授权。
要使用此项目,请将以下依赖项添加到您的构建描述符的依赖项部分
-
Maven(在您的
pom.xml
中)
-
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!
}
});