在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实例,该怎么办?
答案 0 :(得分:0)
共享一个JWTAuth实例是安全的。在对象初始化之后,实现不会改变任何状态,并且非线程安全的Crypto调用是同步的。 但是,如果你可以花费额外的小内存,你应该为每个Verticle创建一个实例,以避免同步。