Vertx JWTAuth实例缓存

时间:2016-12-27 10:53:00

标签: jwt vert.x

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

例如,

Util 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并希望为所有服务器Verticle共享相同的AuthenticationUtil实例,该怎么办?

1 个答案:

答案 0 :(得分:0)

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