Роль авторизации Wicket: ввести учетные данные внешнего пользователя из JSP

#java #jsp #wicket

#java #jsp #wicket

Вопрос:

Я выполняю инкрементную миграцию JSP -> Wicket. Я сохранил приложение JSP и выполнял постраничную миграцию. Я могу перейти и вернуться со страниц JSP <—> wicket.Но моя проблема в том, что в JSP мои учетные данные пользователя, вошедшего в систему, хранятся в компоненте (UserBean, scope: session), и в JSP на каждой странице я проверяю пользователя, вошедшего в систему из этого компонента.

Но как я могу получить эти сведения в wicket? чтобы с моей страницы JSP, если пользователь вошел в систему, при загрузке страницы wicket он мог прочитать это и установить дополнительную информацию, чтобы моя страница входа в систему wicket не отображалась.

моя страница wicket использует wicket-auth-role и проверяет с помощью:

 @AuthorizeInstantiation("ADMIN") public class HomePage extends BasePage {.....}
  

У меня есть мой собственный UserDetailsServcice и MyAuthenticationWebSession в wicket.

После нескольких попыток и помощи от Дона Роби, здесь я получил идентификатор пользователя из сеанса в wicket:

         final RequestCycle requestCycle = RequestCycle.get();
        WebRequest wr=(WebRequest)requestCycle.getRequest();
        HttpServletRequest hsr= wr.getHttpServletRequest();

        AuthenticatedWebSession session = OrbitWebSession.get();
        String username = (String)hsr.getSession().getAttribute("SessionUser");
  

Теперь, где именно я могу установить имя пользователя, пароль и вызвать authenticate, чтобы моя страница не перенаправлялась на страницу входа? Кто вызывает методы authenticate() и как? Я пробовал метод onBeforeRender () на своей защищенной странице, но он не работает. 🙁

Ответ №1:

Более подробный код, касающийся процесса входа в систему, может помочь нам получить более полный ответ, но в основном вам нужно получить доступ к обычному сеансу контейнера сервлета и, следовательно, к этому компоненту откуда-то из wicket. Вероятно, лучшее место для размещения этой логики находится где-нибудь в вашем MyAuthenticationWebSession , чтобы оно знало, что пользователь вошел в систему.

Чтобы получить доступ к сеансу контейнера сервлета из кода wicket, вы можете использовать

 httpSession =
((WebRequest)request).getHttpServletRequest().getSession();
  

Если на момент, когда вы вводите это в свой код wicket, у вас еще нет этого WebRequest объекта (который, скорее всего, является ServletWebRequest объектом), вы можете получить его из RequestCycle :

 RequestCycle requestCycle = RequestCycle.get();
Request request = requestCycle.getRequest();
  

Ответ №2:

аутентификация вызывается AuthenticatedWebSession во время процесса входа в систему. К сожалению для вас, большинство методов в вышеупомянутом классе помечены как final, поэтому их немного сложно настроить.

Что, я думаю, вы должны быть в состоянии сделать, так это использовать защищенный метод signIn (логическое значение) в конструкторе вашего собственного сеанса. Вы получаете там запрос, из которого, мы надеемся, вы сможете получить своего «SessionUser», затем извлечь своего пользователя через свой UserDetailsService, вызвать signIn (true) и инициализировать правильные роли для этого пользователя. Если вызывается signIn (true), вы не должны получать перенаправление для входа в систему.