Вот мои варианты использования.
У меня есть страница входа, которая /public/login.xhtml
. Все остальные мои страницы должны войти в систему, прежде чем их достичь. Они находятся в каталоге /pages/
.
Я хочу это:
- Если мой пользователь получает доступ к
http://host/myapp/pages/*
, он перенаправляет его сначала на страницу входа, а затем на URL, который он впервые ввел.
- Если мой пользователь имеет доступ к
http://host/myapp/
, он перенаправляет его сначала на страницу входа, а затем на /pages/home.xhtml
.
- Если мой пользователь имеет доступ к
http://host/myapp/public/login.xhtml
, он перенаправляет его сначала на страницу входа, а затем на /pages/home.xhtml
.
- Если мой пользователь имеет доступ к
http://host/myapp/public/login.xhtml
и уже вошел в систему, он перенаправляется на /pages/home.xhtml
.
Что сейчас работает?
С Seam 3 (v3.1.0.Final) и модулем Security + Faces мой сценарий использования n ° 1 работает автоматически с:
@ViewConfig
public interface PagesConfig {
static enum Pages {
@ViewPattern("/pages/*")
@LoginView("/public/login.xhtml")
@LoggedIn
LOGGED_IN_PAGES,
}
}
Моя проблема в том, что Я не понимаю, как работает Seam, чтобы сделать это перенаправление в «представление захвата» .
С Seam 2 это было легко понять, в components.xml
у нас было
<event type="org.jboss.seam.security.notLoggedIn">
<action execute="#{redirect.captureCurrentView}" />
</event>
<event type="org.jboss.seam.security.loginSuccessful">
<action execute="#{redirect.returnToCapturedView}" />
</event>
Итак, мы захватили события notLoggedIn
и loginSuccessful
для обработки этого с помощью redirect
компонента.
В Seam 3 я не нашел эту конфигурацию: кажется, что @Observes LoggedInEvent
ничего не существует, и Redirect
класса нет ...
Точка n ° 2 достигается с помощью этого файла /index.htm
:
<html><head>
<meta http-equiv="Refresh" content="0; URL=pages/home.xhtml">
</head></html>
Но для моей точки № 3 я пробовал решения, которые не работают полностью.
Сначала я попробовал это в login.xhtml
:
<f:metadata>
<s:viewAction action="#{loginAction.redirectToHome}" if="#{identity.loggedIn}" immediate="true" />
</f:metadata>
И с или без onPostback="true"
, после того, как я войду в систему, я все еще на странице входа в систему с таким сообщением об ошибке (дважды): " Невозможно найти соответствующий случай навигации с from-view-id« / public /login.xhtml »для действия« # {identity.login} »с результатом« success ». ". Только если я теперь снова получу доступ к http://host/myapp/public/login.xhtml
, мой viewAction
перенаправит меня в дом.
Я также пробовал это правило навигации в faces-config.xml
:
<navigation-rule>
<from-view-id>/public/login.xhtml</from-view-id>
<navigation-case>
<if>#{identity.loggedIn}</if>
<to-view-id>/pages/home.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
Но тогда мой вариант использования № 1 был отключен: каждый раз, когда я входил в систему, меня перенаправляли в дом.
Наконец, для моей точки n ° 4 , s:viewAction
выполняет свою работу.
Так кто-нибудь знает лучшие практики для правильной обработки этих 4-х вариантов использования (которые я считаю наиболее распространенными), особенно пункт № 3?