2010-10-15 51 views
0

我對集羣部署的應用程序進行了更改,以通過Oracle SSO通過Dynamic Directives使用Servlet Filter進行身份驗證。過濾器位於所有應用程序的前面(即使在Seam過濾器的前面)。如果請求是servlet請求並且主體爲空,那麼我將重定向到SSO進行身份驗證。Seam:會話組件爲空,並在每個請求中編譯taglibs

這實際上有效,但有些奇怪的事情開始發生。在第一個請求(我可以在調試頁面中看到它)的外部會話組件(pimUser)在第二個請求中爲null。我得到了經典的異常「@In屬性需要非空值:sessionFinalizer.pimUser」。

更重要的是,我沒有任何EVENT範圍的組件sessionFinalizer的調用,但在CustomIdentity組件的CustomIdentity.logout()方法中,覆蓋了默認的Seam標識。

第三個也是陌生人,應用程序的標記庫被編譯在每個請求中(查看帖子的結尾)。

對我來說什麼味道是,每次請求後會話都會結束,所以每次都會創建一個新的會話。這可以解釋爲什麼會話範圍的組件在第二個請求中不存在。但是,我不知道它是否會解釋反覆編譯的taglib。

我也附上過濾器的代碼,以防萬一我做了一些嚴重錯誤的事情。

任何想法可能是錯誤的,以及如何驗證它?

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..."); 
} 

} 

和控制檯:

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

我很肯定你不能訪問FacesContext.getCurrentInstance()**,因爲請求沒有被FacesServlet **攔截。看到,例如,這個問題:http://stackoverflow.com/questions/3256344 – 2010-10-15 19:11:49

+0

你是對的,這仍然從我做過的一個實驗,將SSO過濾器放在Seam過濾器之後 - 這沒有多大意義,但我仍然嘗試過。 – 2010-10-15 21:25:34

回答

1

一位同事指出,我沒有return;後,我設定濾波器頭部代碼。我在添加return語句後解決了taglibs重新編譯的問題。這導致請求也被SsoFilter(Seam過濾器等)之後的其他過濾器處理。

至於從會話中消失的注入組件,這與required屬性設置爲false有關。我手動注射了

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

而且這個問題也解決了。

+0

感謝您分享發生的事情(+1) – 2010-10-18 16:40:29

相關問題