Обновление заголовка с учетными данными для авторизации без всплывающего окна браузера (Dropwizard 2.0.x) - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь создать небольшой веб-сайт с несколькими страницами с помощью dropwizard. Каждый должен иметь доступ ко всем этим страницам, но я хочу дать возможность войти в систему, а зарегистрированный пользователь должен иметь дополнительные возможности (позже это должно быть основано на ролях). Поскольку это всего лишь небольшой веб-сайт, я думаю, что хочу управлять пользователями в моей собственной базе данных.

Мне уже удалось добавить Authenticator. На самом деле он создается в функции, которую я регистрирую при запуске, поэтому я получаю свои зависимости для DAO, введенные в Authenticator. В основном я делаю это так:

ctx.register(new AuthDynamicFeature(new BasicCredentialAuthFilter.Builder<MyUserStruct>()
                .setAuthenticator(authenticator)
                .setRealm("MyBasicAuth")
                .buildAuthFilter()));
ctx.register(new AuthValueFactoryProvider.Binder<>(MyUserStruct.class));

Чтобы проверить, что Authenticator работает, я дал одному из моих методов в моем классе ресурсов параметр @Auth MyUserStruct pUser. Эта страница больше не реагирует так, как я предполагал позже, вместо этого эту страницу можно увидеть только после успешной аутентификации. И действительно, если я вызову эту страницу, то браузер попросит меня ввести имя пользователя и пароль. После этого я могу получить доступ к этой странице, и если я вызову другие страницы, на которых есть только @Auth Optional<MyUserStruct>, то у них нет учетных данных до того, как я вошел в систему, и я получаю учетные данные после входа в систему. Итак, Authenticator работает, как ожидалось.

На самом деле я должен сказать, что я не вынужден использовать какие-либо технологии, которые я выбрал. Так что я мог выбрать что-то другое, кроме basi c auth. Но единственное, чего я не хочу, так это технологии, использующей файлы cookie, поэтому аутентификация не должна хранить там токены или что-то еще. Вот почему basi c auth, кажется, вполне подходит для моей цели.

Пока все хорошо. Теперь я хочу войти в систему, введя имя пользователя и пароль где-нибудь на моей странице (это будет часть страницы, которая одинакова для всех). В этой части есть кнопка, с помощью которой можно вызвать метод входа в систему моего ресурса, и, возвращая void, я хотел бы остаться на странице, где пользователь ввел свои данные. Я думаю, это то, что называется аутентификацией на основе форм.

И вот моя проблема : теперь, когда я использую свой метод входа в свой ресурс, как я могу войти в систему? Я могу проверить, что комбинация пользователь-пароль действительна, но что мне нужно сделать, чтобы сохранить эту информацию о том, что я вошел в систему, что я аутентифицирован? Я нашел много старых тем и блогов с 2014 по 2016, а иногда и с 2017 года, и они обычно используют dropwizard 0.8, иногда 1.0 и частично библиотеки использования для этой задачи, которые не обновлялись последние 3-5 лет. Я не получаю всю ту информацию, которую я нашел рассортированной в своей голове, поэтому я хотел спросить, как это сделать go (в наши дни, используя dropwizard 2.0.x).

Спасибо, что объяснили мне некоторые возможно бази c вещей. И, может быть, кто-нибудь может указать мне на какой-нибудь рабочий пример, я был бы очень признателен. Поскольку у меня нет ощущения, что я делаю что-то очень экзотическое c.

Я пробовал такие вещи, как добавление @Context HttpHeaders или @Context ContainerRequestContext к моему методу. Но это похоже на прокси, поэтому при их изменении, например,

request.pHttpHeaders.getRequestHeaders().putSingle(HttpHeaders.AUTHORIZATION, "Basic " + base64);

, следующий вызов больше не имеет этой информации. Итак, я также нашел несколько тем, в которых было предложено использовать ContainerResponseFilter или, возможно, ContainerRequestFilter. Но с этим у меня две проблемы. Во-первых, даже если я изменю там http-заголовок, используя жестко запрограммированные фиктивные имя пользователя и пароль, его все равно не будет в моем следующем вызове. И, кроме того, я не знаю, как получить данные, введенные пользователем, так как, глядя в отладчик, я не могу найти их где-либо в данном requestContext или responseContext. Вот и я увидел предлагаемое решение с использованием метода перехватчика (АОП). Но когда я смотрю на это решение, у меня возникает ощущение, что они используют компоненты с отслеживанием состояния, и это не может действительно работать, когда люди одновременно обращаются к веб-сайту. Мне кажется, что такой способ с ContainerResponseFilter не является правильным путем к go. Если это так, мне пришлось бы решить обе проблемы: действительно изменить заголовок и получить доступ к параметрам моего метода. Но искать решение, не будучи убежденным, что это правильный способ решения go, нехорошо, поэтому, повторюсь: было бы здорово, если бы вы могли объяснить мне, как следует решать такого рода проблемы.

ОБНОВЛЕНИЕ Я создал проект на github, демонстрирующий то, что я хотел бы сделать. Возможно, вы сможете взглянуть на него и предложить решение, чтобы ответить на мой вопрос: https://github.com/DeveloperClaus/DropwizardAuthDemo.git

...