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
-
重定向后 – 获取模式