2010-10-15 3 views
0

J'ai apporté une modification à notre application déployée en cluster pour être authentifiée via Oracle SSO avec Dynamic Directives en utilisant un filtre de servlet. Le filtre se trouve devant toute l'application (même devant le filtre Seam). Si la requête est une requête de servlet et que le principal est null, je redirige vers SSO pour l'authentification.Seam: le composant de session est null et taglibs sont compilés dans chaque requête

Cela fonctionne réellement, mais quelque chose d'étrange a commencé à se produire. Un composant de session (pimUser) qui est supprimé lors de la première requête (je peux le voir dans la page de débogage) est null sur la deuxième requête. Je reçois l'exception classique "L'attribut @In requiert une valeur non nulle: sessionFinalizer.pimUser". De plus, je n'ai pas d'invocation du composant sessionFinalizer de portée EVENT, mais dans la méthode personnalisée CustomIdentity.logout(), du composant CustomIdentity, remplaçant l'identité Seam par défaut. Troisièmement et plus étrange, les bibliothèques de balises de l'application sont compilées dans chaque requête (regardez à la fin de la publication).

Ce qui me sent est que la session se termine après chaque requête, et donc une nouvelle session est créée à chaque fois. Cela expliquerait pourquoi le composant de portée de session n'existe pas à la deuxième demande. Cependant, je ne sais pas si cela expliquerait les taglibs compilés encore et encore.

Je joins également le code du filtre, juste au cas où je ferais quelque chose de grossièrement faux.

Des idées de ce qui pourrait être faux et comment le vérifier?

Cheerio!

package eu.emea.pim.prs.web.filters; 

import java.io.IOException; 
import java.util.ArrayList; 

import javax.faces.context.FacesContext; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import eu.emea.pim.prs.model.security.Role; 
import eu.emea.pim.prs.web.auth.OssoDirectivesEnum; 
import eu.emea.pim.prs.web.auth.PrsIdentity; 

/** 
* Filter that checks the request for authenticated user, and in the case no 
* user has authenticated, redirects to the SSO login screen. 
* 
* @author fragkakm 
* 
*/ 
public class SsoFilter implements Filter { 
    private static final Logger logger = LoggerFactory 
     .getLogger(SsoFilter.class); 


@Override 
public void destroy() { 
} 

@Override 
public void doFilter(ServletRequest servletRequest, 
     ServletResponse servletResponse, FilterChain chain) 
     throws IOException, ServletException { 
    try { 
     if (servletRequest instanceof HttpServletRequest) { 
      logger.info("Filtering HttpServletRequest..."); 
      HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; 
      String user = null; 
      // Try to get the authenticate user name 
      try { 
       user = httpServletRequest.getRemoteUser(); 
       logger.info("User from request: {}", user); 
       if(httpServletRequest.getUserPrincipal() == null) { 
        logger.info("User principal is empty."); 
       } else {       
        logger.info("User principal name is {}.", httpServletRequest.getUserPrincipal().getName()); 
       } 

      } catch (Exception e) { 
       user = null; 
      } 

      // If user is not authenticated then generate 
      // dynamic directive for authentication 
      if ((user == null) || (user.length() <= 0)) { 
       logger 
         .info("HttpServletRequest not authenticated, sending directive 499..."); 
       ((HttpServletResponse) servletResponse).sendError(OssoDirectivesEnum.FORCE_AUTHENTICATION.getDirective(), 
         "Oracle SSO"); 
       if (FacesContext.getCurrentInstance() != null) { 
        FacesContext.getCurrentInstance().responseComplete(); 
        logger 
          .info("Prevented JSF from processing response any more."); 
       } 
      } 
     } 
    } catch (IOException e) { 
     logger.error("SSO Filter exception...", e); 
     throw e; 
    } 
    chain.doFilter(servletRequest, servletResponse); 

} 

@Override 
public void init(FilterConfig arg0) throws ServletException { 
    logger.info("Initializing SSO filter..."); 
} 

} 

Et la console: après avoir mis le code d'en-tête dans le filtre

Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains /wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-impl-1.2_12.jar!/META-INF/mojarra_ext.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jboss-seam-ui-2.2.1.CR1.jar!/META-INF/s.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/a4j.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/rich.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/jsp.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/richfaces.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/richfaces-ui-3.3.3.Final.jar!/META-INF/ajax4jsf.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jsf-core.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jsf-html.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jsf-ui.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jstl-core.taglib.xml 
Oct 15, 2010 5:54:51 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit 
INFO: Added Library from: zip:/u01/app/oracle/product/j2ee/user_projects/domains/wls_domain/servers/prs-backend_419/tmp/_WL_user/prs2/54i92t/APP-INF/lib/jsf-facelets-1.1.14.jar!/META-INF/jstl-fn.taglib.xml 
+1

Je suis assez sûr que vous ne pouvez pas avoir accès à FacesContext.getCurrentInstance() ** parce que la demande n'a pas été interceptée par FacesServlet **. Voir, par exemple, cette question: http://stackoverflow.com/questions/3256344 –

+0

Vous avez raison, cela est resté d'une expérience que j'ai faite avant, en plaçant le filtre SSO après le filtre Seam - ce qui n'a pas beaucoup de sens, mais je l'ai essayé quand même. –

Répondre

1

Un collègue a fait remarquer que je ne l'ai pas return;. Le problème de la recompilation de taglibs a été résolu après avoir ajouté l'instruction return. Cela a provoqué la demande d'être également traitée par d'autres filtres après le SsoFilter (le filtre Seam et ainsi de suite).

Dans la mesure où le composant supprimé a disparu de la session, cela concernait un attribut required défini sur false. Je ai sorti manuellement avec

Contexts.getSessionContext().set("user", user); 

et ce problème a également été résolu.

+0

Merci de partager ce qui s'est passé (+1) –

Questions connexes