vertx-аутентификация и управление сессиями

Я использую Vert.x для серверной части и AngularJS для внешнего интерфейса.

Сервер Vert.x получает действия HTTP, используя методы POST и GET. Каким-то образом я получаю разные идентификаторы сеанса для каждого запроса.

Ниже приведен фрагмент кода из моей процедуры обработки класса LoginFormHandler.

authProvider.authenticate(authInfo, res -> {
  if (res.succeeded()) {
    Session session = context.session();
    io.vertx.ext.auth.User user = res.result();
    session.put("user", user);
    req.response().setStatusCode(204).end("user Login success");
    //...
  }
//...
}

Я помещаю пользовательский объект в текущий сеанс. Затем я перехожу на новую страницу и отправляю запрос POST на сервер Vert.x. Внутри этого обработчика POST я пытаюсь получить объект сеанса:

Session session = context.session();
io.vertx.ext.auth.User user = session.get("user");

Я не получаю пользователя. Также, когда я печатаю идентификатор сеанса, я получаю разные значения для обоих сеансов.

У меня есть следующий код в процедуре запуска для потока.

router.route().handler(CookieHandler.create());
router.route().handler(
                SessionHandler.create(LocalSessionStore.create(vertx)));
AuthProvider ap = new MyAuthProvier();
router.route().handler(UserSessionHandler.create(ap));
AuthHandler basicAuthHandler = BasicAuthHandler.create(ap);
router.route("/Services/rest/user/auth").handler(MyFormLoginHandler.create(ap));
router.route("/Services/*").handler(basicAuthHandler);

person Sumit    schedule 14.08.2015    source источник
comment
Что вы имеете в виду под я не понимаю пользователя. Вы получаете объект null?   -  person tmarwen    schedule 17.08.2015


Ответы (1)


Попробуйте использовать новый обработчик для аутентификации.

router.route("/Services/rest/user/auth").handler(new MyFormLoginHandler());
router.route("/Services/*").handler(basicAuthHandler);

Реализуйте обработчик, как показано ниже.

class MyFormLoginHandler implements Handler<RoutingContext> {
public void handle(RoutingContext routingContext) {

    HttpServerResponse response = routingContext.response();
    Session session = routingContext.session();

    routingContext.request().bodyHandler(new Handler<Buffer>() {
        public void handle(Buffer buf)
        {
            ....
            for (User u : users){
               if (u.getPassword().equals(passwd)){
                  session.put("user", u.getUserName());
                  response.setStatusCode(204).end("User Authenticated");
                  break;
               }
            }
        };
    });
}

}

Доступ к пользователю из сеанса.

class TestRequest implements Handler<RoutingContext> {
    public void handle(RoutingContext routingContext) {
        Session session = routingContext.session();
        routingContext.request().bodyHandler(new Handler<Buffer>() {
            public void handle(Buffer buf) {
                .....
                    String userName = session.get("user");
                .....
            };
        });
    }
}
person Ashish    schedule 14.08.2015