Gert, Thanks a million, it works! I can now use <jsp:forward> with a significant performance gain whenever I don't need to redirect. It's a good thing you added this information to the Wiki, because in all my searches for a solution, I never came accross it.
Thanks again, Erik -----Oorspronkelijk bericht----- Van: Gert Vanthienen [mailto:[EMAIL PROTECTED] Verzonden: woensdag 20 september 2006 22:38 Aan: MyFaces Discussion Onderwerp: Re: MyFaces, Tomcat and Acegi Integration Problem Erik, After some investigation, I found out that the problem was unrelated to MyFaces (the problem also occurs when using <jsp:forward/> in plain JSPs) and to Tomcat (it also appears when using Geronimo with Jetty as the web container). Some further research in the Spring mailing lists and JIRA [1, 2, 3] has provided me with a solution. It appears the problem has been solved since Acegi Security 0.9.0 with an additional property being added to org.acegisecurity.intercept.web.FilterSecurityInterceptor named observeOncePerRequest. When setting this boolean property to false, the Acegi Security filter chain is triggered more than once per request, resulting in the correct behavior when using <jsp:forward />. To solve your problem, it is probably sufficient to add a <property /> element to your Acegi configuration file: <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"> ... <property name="observeOncePerRequest" value="false"/> </bean> I have also added this information to the wiki page on JSF and Acegi [4] and I have opened a JIRA issue [5] for the unnecessary warning messages being shown for the <dispatcher/> elements in web.xml. Hope this helps, Gert Vanthienen [EMAIL PROTECTED] [1] http://forum.springframework.org/archive/index.php/t-11025.html [2] http://opensource.atlassian.com/projects/spring/browse/SEC-14 [3] http://forum.springframework.org/showthread.php?t=15291 [4] http://wiki.apache.org/myfaces/JSF_and_Acegi [5] https://issues.apache.org/jira/browse/MYFACES-1415 GOVAERS Erik wrote: > Gert, > > If you can find the time to try it out, please do. The one thing I noticed is > that when I use a <jsp:forward> to send the user to a page which he/she is > not authorised to see, he/she can access it nonetheless. > > Regards, > > Erik > > -----Oorspronkelijk bericht----- > Van: Gert Vanthienen [mailto:[EMAIL PROTECTED] > Verzonden: woensdag 20 september 2006 15:25 > Aan: MyFaces Discussion > Onderwerp: Re: MyFaces, Tomcat and Acegi Integration Problem > > > Erik, > > The WebXmlParser doesn't recognize the <dispatcher> element, but this is > not the component that is responsible for making sure the requests pass > the Acegi Security check. The web container (Tomcat) is responsible for > performing this task. I don't think the warning message your seeing can > cause the filter to be bypassed. > > That's the reason for my suggestion for trying to get the Acegi filter > to work in a simple application and making sure it works there, with > only Tomcat to blame if things go wrong. If you want, I can give it a > try myself this evening or tomorrow morning. I've been postponing to > take a decent look at the Acegi Security filter for too long anyway ;) > > Regards, > > Gert Vanthienen > [EMAIL PROTECTED] > > GOVAERS Erik wrote: > >> Gert, >> >> Thanks for your reply. I added the <dispatcher> elements as described in >> http://wiki.apache.org/myfaces/JSF_and_Acegi to make sure that <jsp:forward> >> requests are captured by the Acegi Filter. Because they are not recognized >> by the WebXmlParser, forward requests can bypass the Acegi Security check. >> No, I haven't tried it in a simple sample application. >> >> Erik >> >> -----Oorspronkelijk bericht----- >> Van: Gert Vanthienen [mailto:[EMAIL PROTECTED] >> Verzonden: woensdag 20 september 2006 14:39 >> Aan: MyFaces Discussion >> Onderwerp: Re: MyFaces, Tomcat and Acegi Integration Problem >> >> >> Erik, >> >> >> I have taken a quick look at the source code of WebXmlParser. It >> currently doesn't have any awareness of the <web-app >> version="2.4".../>-style web.xml, causing it to ignore the 'dispatcher' >> element (which did not exist prior to version 2.4 of the servlet spec), >> hence the warning. However, this is a merely a warning and it doesn't >> change the behavior of MyFaces, as far as I can see. I'm almost certain >> it doesn't modify the way Tomcat handles this filter-mapping. >> >> Have you tried using this filter configuration in a simple (only for >> testing purposes) web application with no JSF, only plain JSPs and >> Servlets? Does it work correctly in these simplified circumstances? >> >> >> Regards, >> >> Gert Vanthienen >> [EMAIL PROTECTED] >> >> GOVAERS Erik wrote: >> >> >>> Hello, >>> >>> I'm using MyFaces with the Spring Framework and Acegi for building a >>> secured web application. Here's my configuration: >>> Tomcat 5.0.28 >>> MyFaces 1.1.3 >>> >>> Tomahawk 1.1.3 >>> Servlets 2.4 (correct header in web.xml, see attachment) >>> To make sure that a jsp forward request is intercepted by Acegi, I added >>> the <dispatcher> elements to the Acegi filter mapping entry in my web.xml >>> as described in <http://wiki.apache.org/myfaces/JSF_and_Acegi>. >>> When I start Tomcat, I get the following warning: "Ignored element >>> 'dispatcher' as child of 'filter-mapping'.", generated by the FilterMapping >>> method in org.apache.myfaces.shared_impl.webapp.webxml.WebXmlParser. I also >>> noticed that jsp forward actions aren't caught by Acegi. Has anybody any >>> idea what I am doing wrong here? The WebXmlParser is part of the >>> tomahawk-1.1.3.jar. >>> >>> Kind regards, >>> Erik Govaers >>> >>> >>> >>> >>> >>> Erik Govaers >>> Medewerker Gehandicaptenzorg >>> Dienst Welzijn Provincie Antwerpen >>> Boomgaardstraat 22 >>> 2600 Berchem >>> Tel.: 03/240 56 72 >>> Fax: 03/240 61 62 >>> >>> >>> ------------------------------------------------------------------------ >>> >>> <?xml version="1.0" encoding="UTF-8"?> >>> >>> <web-app >>> id="WebApp_ID" >>> version="2.4" >>> xmlns="http://java.sun.com/xml/ns/j2ee" >>> xmlns:xsi="http://java.sun.com/xml/ns/j2ee >>> http://www.w3.org/2001/XMLSchema-instance" >>> xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee >>> http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> >>> >>> <!-- This web.xml can be used during debugging, when there is no >>> myfaces.jar >>> library available. >>> >>> The faces-config.xml file (that is normally in the myfaces.jar) >>> must be >>> copied to the /WEB-INF directory of the web context. >>> >>> The TLDs (that are normally in the myfaces.jar) must be >>> copied to the /WEB-INF/lib directory of the web context.--> >>> <description>debug web.xml</description> >>> >>> <context-param> >>> <param-name>javax.faces.CONFIG_FILES</param-name> >>> <param-value>/WEB-INF/faces-navigation.xml</param-value> >>> </context-param> >>> >>> <context-param> >>> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> >>> <param-value>server</param-value> >>> <description> >>> State saving method: "client" or "server" (= default) >>> See >>> JSF Specification 2.5.2 >>> </description> >>> </context-param> >>> >>> <context-param> >>> <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name> >>> <param-value>true</param-value> >>> <description> >>> This parameter tells MyFaces if javascript code should >>> be >>> allowed in the rendered HTML output. If javascript is >>> allowed, command_link anchors will have javascript code >>> that >>> submits the corresponding form. If javascript is not >>> allowed, the state saving info and nested parameters >>> will be >>> added as url parameters. Default: "true" >>> </description> >>> </context-param> >>> >>> <context-param> >>> <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name> >>> <param-value>false</param-value> >>> </context-param> >>> >>> <context-param> >>> <param-name>org.apache.myfaces.PRETTY_HTML</param-name> >>> <param-value>true</param-value> >>> <description> >>> If true, rendered HTML code will be formatted, so that >>> it is >>> "human readable". i.e. additional line separators and >>> whitespace will be written, that do not influence the >>> HTML >>> code. Default: "true" >>> </description> >>> </context-param> >>> >>> <context-param> >>> <param-name>org.apache.myfaces.AUTO_SCROLL</param-name> >>> <param-value>true</param-value> >>> <description> >>> If true, a javascript function will be rendered that is >>> able >>> to restore the former vertical scroll on every request. >>> Convenient feature if you have pages with long lists >>> and you >>> do not want the browser page to always jump to the top >>> if >>> you trigger a link or button action that stays on the >>> same >>> page. Default: "false" >>> </description> >>> </context-param> >>> >>> <context-param> >>> >>> <param-name>org.apache.myfaces.CHECK_EXTENSIONS_FILTER</param-name> >>> <param-value>false</param-value> >>> </context-param> >>> >>> <context-param> >>> <param-name>org.apache.myfaces.ADD_RESOURCE_CLASS</param-name> >>> >>> <param-value>org.apache.myfaces.component.html.util.StreamingAddResource</param-value> >>> </context-param> >>> >>> <context-param> >>> >>> <param-name>org.apache.myfaces.COMPRESS_STATE_IN_SESSION</param-name> >>> <param-value>false</param-value> >>> </context-param> >>> >>> <context-param> >>> >>> <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name> >>> <param-value>false</param-value> >>> </context-param> >>> >>> <!-- Tiles ViewHandler config file --> >>> >>> <context-param> >>> <param-name>tiles-definitions</param-name> >>> <param-value>/WEB-INF/tiles.xml</param-value> >>> <description> >>> Tiles configuration definition files and a listener >>> need to >>> be defined. the listener will initialize >>> JspTilesViewHandlerImpl with tiles definitions. >>> </description> >>> </context-param> >>> >>> <!-- >>> - Location of the XML file that defines the root application >>> context. >>> - Applied by ContextLoaderServlet. >>> - >>> - Can include "/WEB-INF/dataAccessContext-local.xml" for a >>> single-database >>> - context >>> --> >>> <context-param> >>> <param-name>contextConfigLocation</param-name> >>> <param-value> >>> >>> /WEB-INF/dataAccessContext-local.xml,/WEB-INF/applicationContext.xml,/WEB-INF/securityContext.xml >>> </param-value> >>> </context-param> >>> >>> <!-- - - - - - - - ACEGI FILTERS - - - - - - - - --> >>> >>> <filter> >>> <filter-name>Acegi Filter Chain Proxy</filter-name> >>> <filter-class> >>> org.acegisecurity.util.FilterToBeanProxy >>> </filter-class> >>> <init-param> >>> <param-name>targetClass</param-name> >>> <param-value> >>> org.acegisecurity.util.FilterChainProxy >>> </param-value> >>> </init-param> >>> </filter> >>> >>> <!-- - - - - - - - END ACEGI FILTERS - - - - - - - - --> >>> >>> <!-- EXTENSIONS FILTER --> >>> >>> <filter> >>> <filter-name>extensionsFilter</filter-name> >>> <filter-class> >>> org.apache.myfaces.webapp.filter.ExtensionsFilter >>> </filter-class> >>> <init-param> >>> <param-name>uploadMaxFileSize</param-name> >>> <param-value>100m</param-value> >>> <description> >>> Set the size limit for uploaded files. Format: >>> 10 - 10 >>> bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB >>> </description> >>> </init-param> >>> <init-param> >>> <param-name>uploadThresholdSize</param-name> >>> <param-value>100k</param-value> >>> <description> >>> Set the threshold size - files below this limit >>> are >>> stored in memory, files above this limit are >>> stored on >>> disk. >>> >>> Format: 10 - 10 bytes 10k - 10 KB 10m - 10 MB >>> 1g - 1 GB >>> </description> >>> </init-param> >>> <!-- <init-param> >>> <param-name>uploadRepositoryPath</param-name> >>> <param-value>/temp</param-value> >>> <description>Set the path where the intermediary files >>> will be stored. >>> </description> >>> </init-param>--> >>> </filter> >>> >>> <filter-mapping> >>> <filter-name>Acegi Filter Chain Proxy</filter-name> >>> <url-pattern>/*</url-pattern> >>> <dispatcher>FORWARD</dispatcher> >>> <dispatcher>REQUEST</dispatcher> >>> </filter-mapping> >>> >>> <filter-mapping> >>> <filter-name>extensionsFilter</filter-name> >>> <url-pattern>*.jsf</url-pattern> >>> </filter-mapping> >>> >>> <filter-mapping> >>> <filter-name>extensionsFilter</filter-name> >>> <url-pattern>/faces/*</url-pattern> >>> </filter-mapping> >>> >>> <!-- extension mapping for adding <script/>, <link/>, and other >>> resource tags to JSF-pages --> >>> <filter-mapping> >>> <filter-name>extensionsFilter</filter-name> >>> <!-- servlet-name must match the name of your >>> javax.faces.webapp.FacesServlet entry --> >>> <servlet-name>Faces Servlet</servlet-name> >>> </filter-mapping> >>> >>> <!-- >>> - Loads the root application context of this web app at startup, >>> - by default from "/WEB-INF/applicationContext.xml". >>> - Note that you need to fall back to Spring's >>> ContextLoaderServlet for >>> - J2EE servers that do not follow the Servlet 2.4 >>> initialization order. >>> - >>> - Use >>> WebApplicationContextUtils.getWebApplicationContext(servletContext) >>> - to access it anywhere in the web application, outside of the >>> framework. >>> - >>> - The root context is the parent of all servlet-specific >>> contexts. >>> - This means that its beans are automatically available in >>> these child contexts, >>> - both for getBean(name) calls and (external) bean references. >>> --> >>> <listener> >>> <listener-class> >>> org.springframework.web.context.ContextLoaderListener >>> </listener-class> >>> </listener> >>> >>> <!-- FACES SERVLET --> >>> >>> <servlet> >>> <servlet-name>SourceCodeServlet</servlet-name> >>> >>> <servlet-class>org.apache.myfaces.shared_tomahawk.util.servlet.SourceCodeServlet</servlet-class> >>> </servlet> >>> >>> <servlet> >>> <servlet-name>Faces Servlet</servlet-name> >>> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> >>> <load-on-startup>1</load-on-startup> >>> </servlet> >>> >>> <!-- Faces Servlet Mapping --> >>> >>> <!-- extension mapping --> >>> <servlet-mapping> >>> <servlet-name>Faces Servlet</servlet-name> >>> <url-pattern>*.jsf</url-pattern> >>> </servlet-mapping> >>> >>> <!-- WELCOME FILES --> >>> >>> <welcome-file-list> >>> <!-- <welcome-file>index.jsp</welcome-file> --> >>> <welcome-file>index.html</welcome-file> >>> <!-- <welcome-file>./pages/web/homePage.jsp</welcome-file> --> >>> </welcome-file-list> >>> >>> </web-app> >>> >>> >>> >> >> > > > >

