Как защитить маршрут с помощью сеансов Vert.x ⇐ JAVA
Как защитить маршрут с помощью сеансов Vert.x
Я пытаюсь защитить конечные точки с помощью сеансов в Vert.x. В моей конфигурации сеансы инициализируются и могут быть найдены в виде файлов cookie в Postman, значение безопасности равно true, а флаг HttpOnly имеет значение true, но данные сеанса не отображаются. Теперь я попытался маршрутизировать конечные точки, начинающиеся с /api/*, как неавторизованные, если не найден сеанс, но каждый раз, когда я тестирую конечную точку, она возвращает неавторизованную, даже если сеанс присутствует. В одном из решений, которые я искал, я обнаружил, что мне нужно внедрить .handler(CookieHandler.create()) вместе с .handler(sessionHandler); поскольку для работы сеанса vertx требуется обработчик файлов cookie, но в моем проекте нет импорта для Vertx CookieHandler, даже если у меня развернуты зависимости vertx web и ядра vertx. Почему сеанс не найден и данные сеанса не отображаются? Вот что я сделал
Контроллер входа
@Controller публичный класс UserLoginController реализует Function { частный статический окончательный Logger LOGGER = LoggerFactory.getLogger(UserLoginController.class); частная статическая окончательная строка CONTENT = "тип содержимого"; частная статическая окончательная строка JSON_TYPE = «application/json»; частный окончательный UserDal userDal; @Autowired public UserLoginController (маршрутизатор, UserDal userDal, Vertx vertx) { this.userDal = userDal; RedisOptions redisOptions = новый RedisOptions() .setConnectionString("redis://localhost:6379"); Redis redisClient = Redis.createClient(vertx, redisOptions); SessionStore sessionStore = SessionStore.create(vertx, JsonObject.mapFrom(redisClient)); SessionHandler sessionHandler = SessionHandler.create(sessionStore); sessionHandler.setCookieHttpOnlyFlag(истина) .setCookieSecureFlag(истина); router.route("/логин") .handler(sessionHandler); router.post("/логин") .handler(BodyHandler.create()) .respond(это); } @Override public Uni apply (RoutingContext ctx) { Учетные данные LoginData = ctx.body().asPojo(LoginData.class); вернуть userDal.isValidCredentials(учетные данные) .flatMap(логин -> { если (вход) { Сеанс сеанса = ctx.session(); session.put("userId", Credentials.getPhoneNumber()); сеанс.setAccessed(); LOGGER.info("Пользователь успешно вошел в систему. UserPhoneNumber: {}", Credentials.getPhoneNumber()); вернуть ctx.response().setStatusCode(200) .putHeader(CONTENT, JSON_TYPE) .end(new JsonObject().put("сообщение", "Вход успешен") .кодировать()); } еще { LOGGER.info("Не удалось войти в систему для номера телефона: {}", Credentials.getPhoneNumber()); вернуть ctx.response().setStatusCode(401) .putHeader(CONTENT, JSON_TYPE) .end(new JsonObject().put("Неавторизованный!", "Неверный номер телефона или пароль") .кодировать()); } }); } } Фильтр безопасности
@Configuration общественный класс SecurityFilter { частный статический окончательный Logger LOGGER = LoggerFactory.getLogger(SecurityFilter.class); @Autowired общедоступный обработчик void (маршрутизатор) { router.route("/api/*").handler(ctx -> { Сеанс сеанса = ctx.session(); если (сеанс != ноль) { ctx.следующий(); } еще { LOGGER.info("Неавторизовано: сеанс не найден"); ctx.fail(401, новое RuntimeException("Несанкционированное")); } }); } }
Я пытаюсь защитить конечные точки с помощью сеансов в Vert.x. В моей конфигурации сеансы инициализируются и могут быть найдены в виде файлов cookie в Postman, значение безопасности равно true, а флаг HttpOnly имеет значение true, но данные сеанса не отображаются. Теперь я попытался маршрутизировать конечные точки, начинающиеся с /api/*, как неавторизованные, если не найден сеанс, но каждый раз, когда я тестирую конечную точку, она возвращает неавторизованную, даже если сеанс присутствует. В одном из решений, которые я искал, я обнаружил, что мне нужно внедрить .handler(CookieHandler.create()) вместе с .handler(sessionHandler); поскольку для работы сеанса vertx требуется обработчик файлов cookie, но в моем проекте нет импорта для Vertx CookieHandler, даже если у меня развернуты зависимости vertx web и ядра vertx. Почему сеанс не найден и данные сеанса не отображаются? Вот что я сделал
Контроллер входа
@Controller публичный класс UserLoginController реализует Function { частный статический окончательный Logger LOGGER = LoggerFactory.getLogger(UserLoginController.class); частная статическая окончательная строка CONTENT = "тип содержимого"; частная статическая окончательная строка JSON_TYPE = «application/json»; частный окончательный UserDal userDal; @Autowired public UserLoginController (маршрутизатор, UserDal userDal, Vertx vertx) { this.userDal = userDal; RedisOptions redisOptions = новый RedisOptions() .setConnectionString("redis://localhost:6379"); Redis redisClient = Redis.createClient(vertx, redisOptions); SessionStore sessionStore = SessionStore.create(vertx, JsonObject.mapFrom(redisClient)); SessionHandler sessionHandler = SessionHandler.create(sessionStore); sessionHandler.setCookieHttpOnlyFlag(истина) .setCookieSecureFlag(истина); router.route("/логин") .handler(sessionHandler); router.post("/логин") .handler(BodyHandler.create()) .respond(это); } @Override public Uni apply (RoutingContext ctx) { Учетные данные LoginData = ctx.body().asPojo(LoginData.class); вернуть userDal.isValidCredentials(учетные данные) .flatMap(логин -> { если (вход) { Сеанс сеанса = ctx.session(); session.put("userId", Credentials.getPhoneNumber()); сеанс.setAccessed(); LOGGER.info("Пользователь успешно вошел в систему. UserPhoneNumber: {}", Credentials.getPhoneNumber()); вернуть ctx.response().setStatusCode(200) .putHeader(CONTENT, JSON_TYPE) .end(new JsonObject().put("сообщение", "Вход успешен") .кодировать()); } еще { LOGGER.info("Не удалось войти в систему для номера телефона: {}", Credentials.getPhoneNumber()); вернуть ctx.response().setStatusCode(401) .putHeader(CONTENT, JSON_TYPE) .end(new JsonObject().put("Неавторизованный!", "Неверный номер телефона или пароль") .кодировать()); } }); } } Фильтр безопасности
@Configuration общественный класс SecurityFilter { частный статический окончательный Logger LOGGER = LoggerFactory.getLogger(SecurityFilter.class); @Autowired общедоступный обработчик void (маршрутизатор) { router.route("/api/*").handler(ctx -> { Сеанс сеанса = ctx.session(); если (сеанс != ноль) { ctx.следующий(); } еще { LOGGER.info("Неавторизовано: сеанс не найден"); ctx.fail(401, новое RuntimeException("Несанкционированное")); } }); } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение