Vert.x JDBC Auth
基本术语
- Authentication:认证
- Authorisation:授权
- Authority:权限
- Permission:许可
- Role:角色
- User:用户
- Token:令牌
- Principal:凭证
- Handler:处理器
Vert.X中提供了一个使用JDBCClient的AuthProvider实现,它针对任何兼容JDBC的关系数据库执行认证和授权。若要在自己的项目中使用它,则需要在构建描述信息的dependencies节点中添加如下信息:
Maven(在
pom.xml
文件中)<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-auth-jdbc</artifactId>
<version>3.2.1</version>
</dependency>
Gradle(在
build.gradle
文件中)compile io.vertx3.2.1
如果要创建一个客户端实例,你首先需要一个JDBCClient的实例,要知道如何创建这个实例可按照文档中的内容实施。
一旦你创建了一个JDBCClient实例后,就可以按下边代码创建JDBCAuth实例:
JDBCClient jdbcClient = JDBCClient.createShared(vertx, jdbcClientConfig);
JDBCAuth authProvider = JDBCAuth.create(jdbcClient);
创建好上边的实例过后你就可以如使用任何AuthProvider执行认证和授权功能了。
Vert.X的默认标准配置(Out Of the Box)中包含了某些针对认证和授权的信息查询,如果你想要使用不同的数据库模式(Schema),这些查询内容可以通过下边几个方法进行更改:
Vert.X默认实现中的密码在数据库中使用了SHA-512算法加密后进行存储,之后会连接对应的salt
值,这个salt
值和密码存储在同一个表里。
如果你想要重写这些行为,则可以重写setHashStrategy方法去修改Hash策略的设置。
!WARNING
强烈建议在存储密码时使用哈希算法加密过后保存在数据库中,这个哈希值是在创建这一行记录时基于salt
值计算的,应用中应该使用强壮的密码算法,在存储密码时绝对不要使用明文。
认证
如果要使用默认的认证实现,认证信息中用了username
和password
字段进行表述:
JsonObject authInfo = new JsonObject().put("username", "tim").put("password", "sausages");
authProvider.authenticate(authInfo, res -> {
if (res.succeeded()) {
User user = res.result();
} else {
// Failed!
}
});
授权 - Permission/Role模型
尽管Vert.X Auth自身并不要求使用特定的许可模型(它本身只是使用了不透明的字符串),但默认的实现使用了比较熟悉的:用户/角色/许可模型,这样在应用里你可以使用一个或者多个角色,而一个角色也可以拥有一个或者多个许可。
如果要验证一个用户是否拥有特定的许可,则需要将许可信息传递到isAuthorised中:
user.isAuthorised("commit_code", res -> {
if (res.succeeded()) {
boolean hasPermission = res.result();
} else {
// Failed to
}
});
如果要验证一个用户是否属于特定角色,则可以使用前缀法给角色带上前缀表示:
user.isAuthorised("role:manager", res -> {
if (res.succeeded()) {
boolean hasRole = res.result();
} else {
// Failed to
}
});
Vert.X中的默认角色前缀使用了role:
,这个值可通过setRolePrefix进行更改。