【问题标题】:Vertx JWTAuth instance cachingVertx JWTAuth 实例缓存
【发布时间】:2016-12-27 10:53:00
【问题描述】:

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

例如,

实用类

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);
   }
   ...
}

服务器垂直

@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 实例怎么办?

【问题讨论】:

  • 一种方法可以是:将AuthenticationUtil 东西制作(并请重构)一个verticle(或“worker verticle”),您只需要处理异步处理的东西。
  • @ɐuıɥɔɐɯ 谢谢,我本来打算把它做成一个垂直的,但我对它们的工作原理有些怀疑。我问了另一个问题,现在我想我可以做到。

标签: jwt vert.x


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多