У меня есть "пользовательская" (JSF) страница входа для моего приложения. Моя компания использует Siteminder для аутентификации. Таким образом, чтобы войти в Siteminder с «пользовательской» страницы, у меня должна быть форма, которая отправляет сообщения в /login.fcc с соответствующими полями формы (имя пользователя/пароль и пара скрытых полей, специфичных для Siteminder).
Что я пытаюсь сделать, так это продолжать использовать проверки форм и тому подобное в JSF и по-прежнему публиковать сообщения в login.fcc.
Вот урезанная версия моей пользовательской формы:
<rich:messages />
<h:form id="adminLogin" prependId="false">
<h:panelGrid columns="2" styleClass="center">
<h:outputLabel value="HUB USERNAME:" />
<h:inputText id="USER" label="Username" size="12" required="true" />
<h:outputLabel value="HUB PASSWORD:" />
<h:inputSecret id="PASSWORD" label="Password" size="12" required="true" />
<input type="hidden" name="target" value="#{loginController.smTarget}" />
<input type="hidden" name="smagentname" value="#{loginController.smAgentName}" />
</h:panelGrid>
<h:panelGroup layout="block" styleClass="max-width button-panel">
<a4j:commandButton id="adminLoginBtn" value="LOGIN"
styleClass="login-btn"
action="#{loginController.managerLogin}" />
</h:panelGroup>
</h:form>
Обратите внимание, что я использовал стандартные скрытые поля ввода для полей target и smagentname. Это потому, что мне не нужно иметь в моем контроллере как сеттеры, так и геттеры для этих полей. Я просто хочу, чтобы контроллер предоставлял значения при отображении страницы.
Мой метод контроллера выглядит так:
public void managerLogin()
{
LoginController.LOG.debug("manager is logging in...");
LoginController.LOG.debug("user: " + getRequestParameterValue("USER"));
LoginController.LOG.debug("smagent: " + getRequestParameterValue("smagentname"));
LoginController.LOG.debug("target: " + getRequestParameterValue("target"));
forwardTo(LoginController.SM_LOGIN_FCC);
}
Вы можете видеть, что я регистрирую значения из всех полей, кроме поля пароля, и все они правильно печатаются в моем журнале... поэтому я знаю, что получаю значения. Мой метод "forwardTo()" просто получает ExternalContext и вызывает для него dispatch()... передавая путь к странице login.fcc (которая называется "/forms/login.fcc").
Когда я ввожу значения в форму и нажимаю кнопку входа, я вижу свои значения в консоли, но получаю сообщение 404 в своем браузере.
Я могу вручную поместить страницу «/forms/login.fcc» в адресную строку, и у меня не возникает проблем с GET-рендерингом страницы login.fcc. Но я, конечно, не хочу отображать login.fcc (GET), я хочу выполнять вход в систему Siteminder (через POST).
Насколько я понимаю, все параметры запроса становятся доступными через процесс переадресации. Я ожидал, что это сработает.
Я могу взять эту же форму и отменить JSF-ize... и заставить кнопку входа просто отправить форму (чьим действием будет /forms/login.fcc через POST, и это тоже работает нормально, но тогда я теряю преимущества проверки формы/поля, которые предоставляет JSF.
Любые идеи?
http://<some_ip>:8080/<your_webapp>/forms/login.fcc
из управляемого компонента. Вы впервые проверили URL-адрес в браузере? Если это работает, как вы конкретно пытаетесь получить доступ к этому URL-адресу (я имею в виду код методаforwardTo
)? - person Luiggi Mendoza   schedule 01.10.2012