Vert.x JDBC Auth

基本术语

  • Authentication:认证
  • Authorisation:授权
  • Authority:权限
  • Permission:许可
  • Role:角色
  • User:用户
  • Token:令牌
  • Principal:凭证
  • Handler:处理器

Vert.X中提供了一个使用JDBCClientAuthProvider实现,它针对任何兼容JDBC的关系数据库执行认证和授权。若要在自己的项目中使用它,则需要在构建描述信息的dependencies节点中添加如下信息:

  • Maven(在pom.xml文件中)

    1. <dependency>
    2. <groupId>io.vertx</groupId>
    3. <artifactId>vertx-auth-jdbc</artifactId>
    4. <version>3.2.1</version>
    5. </dependency>
  • Gradle(在build.gradle文件中)

    1. compile io.vertx:vertx-auth-jdbc:3.2.1

如果要创建一个客户端实例,你首先需要一个JDBCClient的实例,要知道如何创建这个实例可按照文档中的内容实施。

一旦你创建了一个JDBCClient实例后,就可以按下边代码创建JDBCAuth实例:

  1. JDBCClient jdbcClient = JDBCClient.createShared(vertx, jdbcClientConfig);
  2. JDBCAuth authProvider = JDBCAuth.create(jdbcClient);

创建好上边的实例过后你就可以如使用任何AuthProvider执行认证和授权功能了。

Vert.X的默认标准配置(Out Of the Box)中包含了某些针对认证和授权的信息查询,如果你想要使用不同的数据库模式(Schema),这些查询内容可以通过下边几个方法进行更改:

Vert.X默认实现中的密码在数据库中使用了SHA-512算法加密后进行存储,之后会连接对应的salt值,这个salt值和密码存储在同一个表里。

如果你想要重写这些行为,则可以重写setHashStrategy方法去修改Hash策略的设置。

!WARNING

强烈建议在存储密码时使用哈希算法加密过后保存在数据库中,这个哈希值是在创建这一行记录时基于salt值计算的,应用中应该使用强壮的密码算法,在存储密码时绝对不要使用明文。

认证

如果要使用默认的认证实现,认证信息中用了usernamepassword字段进行表述:

  1. JsonObject authInfo = new JsonObject().put("username", "tim").put("password", "sausages");
  2. authProvider.authenticate(authInfo, res -> {
  3. if (res.succeeded()) {
  4. User user = res.result();
  5. } else {
  6. // Failed!
  7. }
  8. });

授权 - Permission/Role模型

尽管Vert.X Auth自身并不要求使用特定的许可模型(它本身只是使用了不透明的字符串),但默认的实现使用了比较熟悉的:用户/角色/许可模型,这样在应用里你可以使用一个或者多个角色,而一个角色也可以拥有一个或者多个许可。

如果要验证一个用户是否拥有特定的许可,则需要将许可信息传递到isAuthorised中:

  1. user.isAuthorised("commit_code", res -> {
  2. if (res.succeeded()) {
  3. boolean hasPermission = res.result();
  4. } else {
  5. // Failed to
  6. }
  7. });

如果要验证一个用户是否属于特定角色,则可以使用前缀法给角色带上前缀表示:

  1. user.isAuthorised("role:manager", res -> {
  2. if (res.succeeded()) {
  3. boolean hasRole = res.result();
  4. } else {
  5. // Failed to
  6. }
  7. });

Vert.X中的默认角色前缀使用了role:,这个值可通过setRolePrefix进行更改。