Как эмулировать wicket setResponsePage () в spring security
Ситуация : пользователь вынужден изменить пароль при нажатии кнопки "Изменить пароль". Этот щелчок запускает переопределенный метод onSubmit() (Wicket). В этом методе:
protected void onSubmit() {
//changing password by updating it in DB
// autologin user with changed password in system
//set response page (wicket style)
setResponsePage(RestorePasswordPage.class);
}
Фактически вызов setResponsePage(...) является вызовом к калитке компонента.setResponsePage ()
public final <C extends Page> void setResponsePage(final Class<C> cls)
{
getRequestCycle().setResponsePage(cls);
}
Моя задача состояла в том, чтобы заменить калитку на Spring security, и она была решена-я перехватываю вызов этого метода в цепочке безопасности Spring Filter (класс ниже является одним из компонентов этого chaing). И может делать все вещи из приведенного выше фрагмента кода, кроме одного - я не знаю, как сделать перенаправление на RestorePasswordPage
public class ForgotPasswordForcePasswordChangeEventHandler implements CustomEventHandler {
public void handle(HttpServletRequest request, HttpServletResponse response) {
// 1. Extract current customer
// 2. Extract changed password
// 3. Updates user through external web service
// 4. Prepares data for authentication
// 5. Clears security context to remove current authentication
//redirect to the same page as in wicket
HOW???
}
}
Вопросы :
- Есть ли способ получить доступ к Wicket RequestCycle, если я получил только HttpServletRequest запрос в качестве входных данных.
- Есть ли другой способ решить эту проблему?
2 ответа:
Wicket поддерживает" bookmarkable " pages - классы страниц, которые имеют конструктор без параметров или просто принимают объект PageParameters. (PageParameters-это абстракция над строковыми параметрами запроса и др.)
Если вам не нужно настраивать экземпляр страницы, на который выполняется перенаправление в коде, вы можете использовать
WebApplication#mountPage
внутри вашегоWebApplication#init
, Чтобы смонтировать его на" хорошем " статическом URL. Затем необходимо настроить пружину безопасности для перенаправления URL-адреса. IIRC, Spring Security перехватывает запрос перед калиткой вовлекается, поэтому нет необходимости и, вероятно, нет разумного способа получить доступ к обработке запросов Уикета.Если вам действительно нужны параметры на странице, на которую вы перенаправляете, взгляните на документацию по отображению запроса . По существу, вы даете странице конструктор с аргументом
PageParameters
. ИспользуяPageParameters
, вы всегда можете получить доступ к любым параматерам, заданным в стандартной строке запроса, и" позиционным параметрам " (несопоставленным дополнительным компонентам URL) без какой-либо конфигурации. При монтаже страницы вы можно также определить "именованные" параметры (дополнительные компоненты URL, которые помещаются в карту PageParameters под предопределенными именами) и многое другое.
Вы можете выполнить перенаправление, бросив
RestartResponseException
.throw new RestartResponseException(RestorePasswordPage.class, somePageParameters);
Или
throw new RestartResponseException(new RestorePasswordPage(Object parameters));
RequestCycle
, и другие элементы, такие какSession
, автоматически сохраняются калиткой вThreadLocal
переменные, так что вы можете получить их, когда захотите, с помощью статических методов:RequestCycle.get()
Кстати, вот вопрос, уточняющий
RestartResponseException
: калитка: как перенаправить на другую страницу?