JSF – Spring Security Integration问题

Servlet 2.4+ API允许我们使用标记内的标记,使用FORWARD值来拦截内部转发到其他资源的请求。 对于一个servlet转发到另一个servlet,spring安全约束工作正常。

  springSecurityFilterChain /* FORWARD REQUEST  

问题:安全filter似乎没有使用JSF操作拦截内部转发

在使用JSF操作(导航案例)时,JSF似乎将请求“转发”到目标视图(页面)。 这会导致URL落后于页面的实际URL一步。

这样做的副作用是弹簧安全约束(与URL绑定)在下一个操作之前不会生效。

示例:当前页面URL: http://host/myapp/page1.xhtml (page1.xhtml有一个导航到受保护的page2的操作)

在提交时,请求将提交给呈现page2.xhtml的服务器,但URL仍保留为http://host/myapp/page1.xhtml 。 Spring Security不拦截和保护page2.xhtml

这可以通过指定以下内容来克服:

  page2 /page2.xhtml    

重定向不是我们想要实现这一目标的方式。 有没有更好的方法让Spring Security与JSF一起使用?

编辑:(spring配置xml的相关片段)

                  

从马的嘴里 (oracle文档)

如果导航案例不使用重定向元素, 则新页面将呈现为对当前请求的响应 ,这意味着浏览器地址字段中的URL不会更改,并且它将包含上一页的地址。

这似乎转化为在JSF生命周期中没有“向前”发生在下一页……所以Spring Security将永远无法解决这个问题。

默认情况下,FilterSecurityInterceptor只执行每个请求一次并且不进行安全性重新检查,除非url中有更改但是使用JSP / JSF转发页面将呈现为对当前请求和当前请求的URL的响应。浏览器包含上一页的地址。 因此,只需在applicationContext中的http元素中将once-per-request属性设置为false,从而强制进行安全性重新检查。

  

并在web.xml中的springSecurityFilterChainfilter映射中为转发添加一个调度程序

  springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /* FORWARD REQUEST  

更多信息

或者,您也可以通过将参数faces-redirect = true附加到结果来启用页面重定向,如下所示:

    

但正如BalusC所说,使用POST进行页面导航是不好的做法。 总是使用GET

  or  

另见:

  • 当-应该-I-使用-houtputlink-INSTEAD-OF-hcommandlink

  • 重定向后 – 获取模式