Java JSF-Spring安全集成问题
Servlet 2.4+API允许我们使用Java JSF-Spring安全集成问题,java,jsf,spring-security,Java,Jsf,Spring Security,Servlet 2.4+API允许我们使用标记中的标记,其值类似于FORWARD,以拦截内部转发到其他资源的请求。对于一个servlet到另一个servlet的转发,spring安全约束可以正常工作 <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> <disp
标记中的
标记,其值类似于FORWARD
,以拦截内部转发到其他资源的请求。对于一个servlet到另一个servlet的转发,spring安全约束可以正常工作
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
springSecurityFilterChain
/*
向前地
要求
问题:
安全过滤器似乎不使用JSF操作拦截内部转发
在使用JSF操作(导航用例)时,JSF似乎将请求“转发”到目标视图(页面)。这会导致URL比页面的实际URL落后一步
这样做的一个副作用是,spring安全约束(绑定到URL)在下一个操作之前不会生效
示例:
当前页面URL:
(page1.xhtml有一个操作,可导航到受保护的page2)
提交时,请求被提交到呈现page2.xhtml的服务器,但URL仍然保持不变。Spring Security不拦截和保护page2.xhtml
可以通过指定以下内容来克服这一问题:
<navigation-case>
<from-outcome>page2</from-outcome>
<to-view-id>/page2.xhtml</to-view-id>
<redirect/> <!--REDIRECT, INSTEAD OF FORWARD-->
</navigation-case>
第2页
/page2.xhtml
重定向不是我们想要实现这一目标的方式。有没有更好的方法让Spring Security与JSF协同工作?
编辑:(spring配置xml的相关片段)
来自(oracle文档)
如果导航案例不使用重定向元素,新页面将作为对当前请求的响应呈现,,这意味着浏览器地址字段中的URL不会更改,并且它将包含上一页的地址
这似乎意味着,在JSF生命周期中,下一页不会发生“转发”。。。因此,Spring Security将永远无法处理此问题。来自(oracle文档)
如果导航案例不使用重定向元素,新页面将作为对当前请求的响应呈现,,这意味着浏览器地址字段中的URL不会更改,并且它将包含上一页的地址
这似乎意味着,在JSF生命周期中,下一页不会发生“转发”。。。因此,Spring安全性将永远无法处理此问题。默认情况下,FilterSecurityInterceptor只会在每个请求中执行一次,并且不会执行安全性重新检查,除非url发生更改,但使用JSP/JSF转发,页面将作为对当前请求的响应呈现,并且浏览器中的url包含请求的地址上一页。为此,只需在applicationContext中的http元素中将“每个请求一次”属性设置为false,从而强制重新检查安全性
<http auto-config="true" use-expressions="true" once-per-request="false">
并在web.xml中的springSecurityFilterChain过滤器映射中添加转发调度程序
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
向前地
要求
更多
或者,您也可以通过在结果后面附加参数faces redirect=true来启用页面重定向,如下所示:
<h:form>
<h:commandButton action="page1?faces-redirect=true" value="Page1" />
</h:form>
但正如所说的,使用POST进行页面间导航并不是一个好的做法。一定要经常使用
<h:link> or <h:button>
或
另见:
<http auto-config="true" use-expressions="true" once-per-request="false">
并在web.xml中的springSecurityFilterChain过滤器映射中添加转发调度程序
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
向前地
要求
更多
或者,您也可以通过在结果后面附加参数faces redirect=true来启用页面重定向,如下所示:
<h:form>
<h:commandButton action="page1?faces-redirect=true" value="Page1" />
</h:form>
但正如所说的,使用POST进行页面间导航并不是一个好的做法。一定要经常使用
<h:link> or <h:button>
或
另见: