Vertx JWTAuth 实例缓存

Vertx JWTAuth instance caching

在 Vert.x 文档 here 中,我看到您可以获取 JWTAuth 对象的实例并在处理程序中使用它。我不确定我是否可以将对该对象的引用存储在静态变量或实例变量中,以便稍后使用它为多个请求创建新令牌。我计划创建一个 class 来管理 JWT 令牌身份验证并在构造函数上获取对 JWTAuth 对象的引用。然后,在处理程序调用的方法上,使用存储在实例变量中的引用来创建令牌。这个可以吗?或者 API 被设计为在我每次需要时调用 JWTAuth.create() 以达到最佳效果?

例如,

实用程序class

public class AuthenticationUtil {
   private JWTAuth auth;

   public AuthenticationUtil(Vertx vertx) {
      JsonObject authConfig = new JsonObject().put("keyStore", new JsonObject()
          .put("type", "jceks")
          .put("path", "keystore.jceks")
          .put("password", "secret"));

      auth = JWTAuth.create(vertx, authConfig);
   }

   public void getToken(RoutingContext context) {
       if (validateCredentials(context.request().getParam("username"), context.request().getParam("password"))) {
           context.response().end(auth.generateToken(new JsonObject(), new JWTOptions()));
       } else {
           context.fail(401);
       }
   }

   public Handler<RoutingContext> createAuthHandler() {
       return JWTAuthHandler.create(auth);
   }
   ...
}

ServerVerticle

@Override
public void start(Future<Void> future) {
    AuthenticationUtil authUtil = new AuthenticationUtil(vertx);
    ...
    router.post("/auth").blockingHandler(authUtil::getToken);
    router.get("/someProtectedResource1").handler(authUtil.createAuthHandler());
    router.get("/someProtectedResource2").handler(authUtil.createAuthHandler());
    ...
}

如果我创建了很多服务器 Verticle,并且想为它们共享同一个 AuthenticationUtil 实例怎么办?

共享单个 JWTAuth 实例是安全的。在对象初始化和非线程安全加密调用同步后,该实现不会改变任何状态。 但是,如果您可以额外花费少量内存,则应为每个 Verticle 创建一个实例以避免同步。