Comment mettre en œuvre rediriger vers la page d'identification avec Java EE 6/Glassfish
Je suis en train de mettre en œuvre une redirection après la connexion, ce qui signifie que je ne peux pas utiliser glassfish formulaire intégré les paramètres d'authentification plus qui gère automatiquement les choses. Donc, première chose, j'ai besoin de prendre le contrôle d'une redirection vers une page de connexion lorsque vous demandez une page protégée. Ce que je comprends, c'est fait avec un filtre. Cette méthode peut-elle être combinée avec la sécurité des contraintes dans le web-xml? Comme il est, mon filtre n'est pas appelée à tous depuis glassfish juste prend le dessus et jette une base loginbox à l'utilisateur et ignore tous les filtres, même quand aucune connexion de configuration est réglé. Bref, je n'ai pas réussi à obtenir un filtre avant qu'un utilisateur a ouvert une session quand les contraintes de sécurité sont configurés dans glassfish.
Dois-je vraiment besoin de prendre plus de sécurité complètement manuellement dans un filtre pour que cela fonctionne? Si c'est le cas, la mise en œuvre semble horrible.
À l'aide de glassfish 3.1 avec JSF 2 et personnalisé loginpage de vous connecter manuellement à la demande.connexion.
web.xml.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value><!--Production-->Development</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>de.odysseus.el.ExpressionFactoryImpl</param-value>
</context-param>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.xdin.competence.jsf.util.LoginFilter</filter-class>
</filter>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsf</welcome-file>
</welcome-file-list>
<!--<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/viewExpired.jsf</location>
</error-page>-->
<security-constraint>
<display-name>ManagerArea</display-name>
<web-resource-collection>
<web-resource-name>ManagerArea</web-resource-name>
<description/>
<url-pattern>/manager/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>Manager-role</role-name>
<role-name>Admin-role</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>EmployeeArea</display-name>
<web-resource-collection>
<web-resource-name>EmployeeConstraint</web-resource-name>
<description/>
<url-pattern>/user/Overview.jsf</url-pattern>
<url-pattern>/user/PrepareReport.jsf</url-pattern>
<url-pattern>/user/Search.jsf</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>Employee-role</role-name>
<role-name>Admin-role</role-name>
<role-name>Manager-role</role-name>
<role-name>OKIF-role</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>AdminArea</display-name>
<web-resource-collection>
<web-resource-name>AdminCompetence</web-resource-name>
<description/>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>Admin-role</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>UserArea</display-name>
<web-resource-collection>
<web-resource-name>UserConstraint</web-resource-name>
<description/>
<url-pattern>/index.jsf</url-pattern>
<url-pattern>/template.jsf</url-pattern>
<url-pattern>/user/UserDetail.jsf</url-pattern>
<url-pattern>/user/UserInformation.jsf</url-pattern>
<url-pattern>/print/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>Employee-role</role-name>
<role-name>Admin-role</role-name>
<role-name>Manager-role</role-name>
<role-name>OKIF-role</role-name>
</auth-constraint>
</security-constraint>
<!--<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsf</form-login-page>
<form-error-page>/login.jsf</form-error-page>
</form-login-config>
</login-config>-->
<security-role>
<description/>
<role-name>Employee-role</role-name>
</security-role>
<security-role>
<description/>
<role-name>Admin-role</role-name>
</security-role>
<security-role>
<description/>
<role-name>Manager-role</role-name>
</security-role>
<security-role>
<description/>
<role-name>OKIF-role</role-name>
</security-role>
</web-app>
Et mon filtre:
public class LoginFilter implements Filter {
private FilterConfig filterConfig = null;
public LoginFilter() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
if (req.getUserPrincipal() == null) {
req.getSession().setAttribute("from", req.getRequestURI());
res.sendRedirect("/login.jsf");
} else {
chain.doFilter(request, response);
}
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
}
Je suis en utilisant une forme personnalisée basée sur la connexion manuel de la demande.de connexion, et ne sont donc pas à l'aide de j_security_check.
Ah bon, je vois.
OriginalL'auteur Rasmus Franke | 2011-04-28
Vous devez vous connecter pour publier un commentaire.
Dans votre personnalisé formulaire de connexion, ajoutez les éléments suivants champ caché:
que vous définissez dans JSF comme suit
et redirection comme suit dans la connexion méthode d'action
Pas besoin d'un
Filter
.Ah ok, par
externalContext.getRequestParameterMap().get("from")
à la place.Hmm ne fonctionne pas au premier essai, vais essayer de plus demain. Je vous remercie.
Cette ligne doit être mis dans la méthode de connexion. Aussi la
<input type="hidden">
doit être mis dans le<h:form>
et la soumission doit comprendre la valeur du champ en paramètre caché (prendre cela en compte lors de l'utilisation d'ajax). Bien sûr, la page de connexion doit être ouvert par le servletcontainer lorsque le client ouvre la restreinte de la page, pas la page de connexion lui-même directement.Débogué et le problème était juste que le nom de l'application est la partie de l'url et je suis retourné à partir d'une méthode d'action qui a entraîné /appname/appname/page.jsf être retournés, à l'origine pour rediriger vers la page de connexion à nouveau. Est-il possible d'obtenir juste la partie pertinente de l'url? Également sur une note de côté, vous pouvez obtenir les paramètres de l'url aswell? Une sorte de liste de ce que le requestScope carte contient serait vraiment apprécié.
OriginalL'auteur BalusC