Как эмулировать калитку setResponsePage () в весенней безопасности - PullRequest
4 голосов
/ 30 сентября 2011

Ситуация : пользователь вынужден сменить пароль при нажатии кнопки «Изменить пароль».Этот щелчок запускает переопределенный метод 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 (...) является вызовом Wicket Component.setResponsePage ()

public final <C extends Page> void setResponsePage(final Class<C> cls)
{
    getRequestCycle().setResponsePage(cls);
}

Моя задача состояла в том, чтобы заменить калитку на Spring Security иэто было решено - я перехватываю вызов этого метода в Spring Filter Security Chain (класс ниже является одним из компонентов этой цепочки).И может делать все из приведенного выше фрагмента кода, кроме одного - я не знаю, как сделать перенаправление на 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???
   }
}

Вопросы :

  1. Есть ли способ получить доступ к Wicket RequestCycle, если я получил только запрос HttpServletRequest в качестве ввода.
  2. Есть ли другой способ решения этой проблемы?

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Wicket поддерживает «закладки» страниц - классы страниц, которые имеют конструктор без параметров или просто принимают объект PageParameters.(PageParameters - это абстракция над параметрами строки запроса и др.)

Если вам не нужно настраивать экземпляр страницы, на который вы перенаправляетесь в коде, вы можете использовать WebApplication#mountPage внутри вашего WebApplication#init смонтировать его по «красивому» статическому URL.Затем вы настраиваете Spring Security для перенаправления на этот URL.IIRC, Spring Security перехватывает запрос до того, как Wicket вмешивается, поэтому нет необходимости и, вероятно, нет нормального способа получить доступ к обработке запроса Wicket.

Если вам нужны параметры на странице, на которую вы перенаправляете, сделайтепосмотрите документацию по отображению запроса .По сути, вы даете странице конструктор с аргументом PageParameters.Используя PageParameters, вы всегда можете получить доступ к любым параметрам, указанным в стандартной строке запроса, и к «позиционным параметрам» (не отображенные дополнительные компоненты URL) без какой-либо конфигурации.При монтировании страницы вы также можете определить «именованные» параметры (дополнительные компоненты URL, которые помещаются в карту PageParameters под предопределенными именами) и еще много чего.

2 голосов
/ 30 сентября 2011

Вы можете выполнить перенаправление, бросив RestartResponseException.

throw new RestartResponseException(RestorePasswordPage.class, somePageParameters);

или

throw new RestartResponseException(new RestorePasswordPage(Object parameters));

RequestCycle и другие элементы, такие как Session автоматически сохраняются в Wicket в ThreadLocal переменных, поэтому вы можете получить их в любое время с помощью статических методов: RequestCycle.get()

Кстати, вотвопрос про RestartResponseException: Wicket: как перенаправить на другую страницу?

...