現在、ユーザーがウェブPOST
フォーム、カスタム認証者、およびカスタムユーザーを使用して自分のWebサーバーにログインすると、私は、RoutingContext#setUser
を使用している場合、その要求のためにユーザを変更するだけで、ユーザがログイン処理ページから宛先にリダイレクトされるとすぐに、CustomUser
が失われているので、CustomUser
がRoutingContext
によって提供されているSession
に入れられています。セッションの処理とvertxのログインユーザーの記憶
しかし、それはまた、認証がCustomUser
配置エントリに格納されているすべてのユーザーを持っていない新しいページ用RoutingContext
でSession
が、これは完全に異なる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はセッション中の自分のようなルーキーのための次善のドキュメントを用意しています。誰かをログインさせ、通常のウェブサイトのようにセッションを維持する方法についての助けがあれば幸いです。同じ問題つまずくが、通常のコメントをスキップする人のために
あなたの例では、あなたがセッションストアを作成する方法を省略しました。問題があるかもしれないと思うので、それらの行を追加してください。また、Vert、xのドキュメントは非常に冗長ではありませんが、私はその例がかなり良いと思います。あなたはこれを見ましたか? https://github.com/vert-x3/vertx-examples/blob/master/web-examples/src/main/java/io/vertx/example/web/sessions/Server.java –
@AlexeySoshin私は追加しましたルーティングコードとあなたは問題がどこにあるのかが間違っています - CookieHandlerとSessionHandlerは間違った方法です。ソリューションを追加したい場合は、それを正しいものとしてマークします。 – Rob