【发布时间】: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ıɥɔɐɯ 谢谢,我本来打算把它做成一个垂直的,但我对它们的工作原理有些怀疑。我问了另一个问题,现在我想我可以做到。