2016-12-27 2 views
2

В документации Vert.x here, я вижу, что вы можете получить экземпляр объекта JWTAuth и использовать его в обработчике. Я не уверен, могу ли я хранить ссылку на объект в переменной static или экземпляра, чтобы использовать его позже для создания новых токенов для нескольких запросов. Я планировал создать класс для управления аутентификацией токена JWT и получить ссылку на объект JWTAuth на конструкторе. Затем в методе, вызываемом обработчиком, используйте ссылку, хранящуюся в переменной экземпляра, чтобы создать токен. Это нормально? Или API был разработан, чтобы работать лучше всего, вызывая JWTAuth.create() каждый раз, когда мне это нужно?Экземпляр экземпляра Vertx JWTAuth

Например,

Util класс

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

Что делать, если я создаю много verticles сервера, и вы хотите, чтобы одни и те же экземпляр AuthenticationUtil для всех из них?

+1

Одним из подходов может быть: make (и, пожалуйста, рефакторинг) вещь 'AuthenticationUtil', вертикаль (или« рабочая вертикаль »), и вам нужно иметь дело только с асинхронной обработкой. –

+0

@ ɐuıɥɔɐɯ Спасибо, я планировал сделать его вертикулой, но у меня были некоторые сомнения в том, как они работали. Я задал еще один вопрос об этом, и теперь я думаю, что смогу это сделать. – rober710

ответ

0

Безопасно разделить один экземпляр JWTAuth. Реализация не мутирует какое-либо состояние после инициализации объекта и синхронизирует криптозащитные потоки без потоков. Однако, если вы можете потратить небольшую дополнительную память, вы должны создать один экземпляр для каждой вершины, чтобы избежать синхронизации.

Смежные вопросы