2016-08-25 7 views
0

現在、ユーザーがウェブPOSTフォーム、カスタム認証者、およびカスタムユーザーを使用して自分のWebサーバーにログインすると、私は、RoutingContext#setUserを使用している場合、その要求のためにユーザを変更するだけで、ユーザがログイン処理ページから宛先にリダイレクトされるとすぐに、CustomUserが失われているので、CustomUserRoutingContextによって提供されているSessionに入れられています。セッションの処理とvertxのログインユーザーの記憶

しかし、それはまた、認証がCustomUser配置エントリに格納されているすべてのユーザーを持っていない新しいページ用RoutingContextSessionが、これは完全に異なるSessionを送信することができているかのように思えますか?

Routing

//ROUTE DEFINITIONS 
    // SESSION AND COOKIE 
    router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)).setNagHttps(false)); //TODO SSL 
    router.route().handler(CookieHandler.create()); 
    // STATIC 
    router.route("/").handler(new StaticHandler()); //BASE 
    router.route("/admin").handler(new StaticHandler()); //ADMIN PAGE 
    // FORM REQUESTS 
    router.route("/login").handler(new AuthAndRegHandler(new CustomAuth(), dbController)); //LOGIN REQUEST 
    router.route("/logout").handler(new AuthAndRegHandler(new CustomAuth(), dbController)); //LOGOUT REQUEST 
    // AJAX 
    router.route("/ajax/updateInvoice").handler(new AjaxHandler()); 
    // ERRORS 
    router.route().failureHandler(new ErrorHandler()); 
    router.route().handler(handle -> { 
     handle.fail(404); 
    }); 
    //END DEFINITIONS 

AuthAndRegHandler

public class AuthAndRegHandler extends AuthHandlerImpl { 

    private DatabaseController db; 
    private CustomAuth authProvider; 

    public AuthAndRegHandler(CustomAuth authProvider, DatabaseController db) { 
     super(authProvider); 
     this.db = db; 
     this.authProvider = authProvider; 
    } 

    @Override 
    public void handle(RoutingContext event) { 
     Logger log = LoggerFactory.getLogger(this.getClass()); 
     HttpServerResponse response = event.response(); 
     HttpServerRequest request = event.request(); 
     Session session = event.session(); 
     String requestedPath = request.path(); 

     authProvider.setJdbc(db.getJdbc()); //returns a JDBCClient 

     if(requestedPath.equalsIgnoreCase("/login")) { 
      if(request.method() != HttpMethod.POST) 
       event.fail(500); 
      else { 
       request.setExpectMultipart(true); 
       request.endHandler(handle -> { 
        MultiMap formAtts = request.formAttributes(); 
        String email = formAtts.get("email"); 
        String pw = formAtts.get("password"); 

        log.info(email + ":" + pw + " login attempt"); 

        authProvider.authenticate(new JsonObject() 
          .put("username", email) 
          .put("password", pw), res -> { 
           if(res.succeeded()) { 
            CustomUser userToSet = (CustomUser) res.result(); 

            session.put("user", userToSet); 
            log.info("Login successful for " + email); 
            response.putHeader("Location", "/").setStatusCode(302).end(); 
           } else { 
            event.fail(500); 
            log.error("Auth error for " + request.host()); 
           } 
          }); 
       }); 
      } 
     } 
    } 
} 

CustomAuth真を返すテスト目的のために毎回。

StaticHandler

CustomUser user = session.get("user"); 
    event.setUser(user); 
    response.putHeader("Content-Type", "text/html"); 

    if(user != null) { 
     log.info(user.principal().getString("email") + " user detected"); 
     event.setUser(user); 
    } else 
     log.info("Null user request detected"); //Constantly outputs, even after a login form has been submitted 

は私が間違ってここに何が起こっているのか全くわかりません。 Vertxはセッション中の自分のようなルーキーのための次善のドキュメントを用意しています。誰かをログインさせ、通常のウェブサイトのようにセッションを維持する方法についての助けがあれば幸いです。同じ問題つまずくが、通常のコメントをスキップする人のために

+1

あなたの例では、あなたがセッションストアを作成する方法を省略しました。問題があるかもしれないと思うので、それらの行を追加してください。また、Vert、xのドキュメントは非常に冗長ではありませんが、私はその例がかなり良いと思います。あなたはこれを見ましたか? https://github.com/vert-x3/vertx-examples/blob/master/web-examples/src/main/java/io/vertx/example/web/sessions/Server.java –

+0

@AlexeySoshin私は追加しましたルーティングコードとあなたは問題がどこにあるのかが間違っています - CookieHandlerとSessionHandlerは間違った方法です。ソリューションを追加したい場合は、それを正しいものとしてマークします。 – Rob

答えて

1

Vert.x SessionHandlerはCookieHandlerのに依存し、順序はここでは重要です。 Vert.x examplesから

router.route().handler(CookieHandler.create()); 
router.route().handler(sessionHandler); 
関連する問題