java JSF Spring安全集成问题
Servlet 2.4+API允许我们在<filter-mapping>
标记中使用<dispatcher>
标记,并使用FORWARD
等值来拦截内部转发到其他资源的请求。对于一个servlet到另一个servlet的转发,spring安全约束可以正常工作
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
问题: 安全过滤器似乎不会通过JSF操作拦截内部转发
在使用JSF操作(导航用例)时,JSF似乎将请求“转发”到目标视图(页面)。这会导致URL比页面的实际URL落后一步
这样做的一个副作用是,spring安全约束(绑定到URL)在下一个操作之前不会生效
示例: 当前页面URL:http://host/myapp/page1.xhtml (page1.xhtml有一个操作可以导航到受保护的page2)
提交时,请求被提交到呈现page2的服务器。但是URL仍然是http://host/myapp/page1.xhtml。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>
重定向不是我们想要实现的方式。有没有更好的方法让Spring Security与JSF协同工作
编辑:(spring配置xml的相关片段)
<http use-expressions="true" once-per-request="false">
<intercept-url pattern="/index.xhtml" access="permitAll" />
<intercept-url pattern="/page1.xhtml" access="isAuthenticated()" />
<intercept-url pattern="/page2.xhtml" access="hasRole('supervisor')" />
<intercept-url pattern="/page3.xhtml" access="hasRole('teller')" />
<form-login login-page="/login.html" default-target-url="/page1.xhtml"/>
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="rod" password="rod" authorities="supervisor, user" />
<user name="dianne" password="dianne" authorities="teller, user" />
<user name="scott" password="scott" authorities="supervisor" />
<user name="peter" password="peter" authorities="user" />
</user-service>
</authentication-provider>
</authentication-manager>
# 1 楼答案
默认情况下,FilterSecurityInterceptor只会在每个请求中执行一次,并且不会执行安全性重新检查,除非url中有更改,但使用JSP/JSF转发时,页面将作为对当前请求的响应呈现,并且浏览器中的url包含上一页的地址。为此,只需在applicationContext中的http元素中将“每个请求一次”属性设置为false,从而强制重新检查安全性
并在springSecurityFilterChain过滤器映射中添加转发调度程序。xml
更多info
或者,您也可以通过在结果后面附加参数faces redirect=true来启用页面重定向,如下所示:
但是正如BalusC所说的,使用POST进行页面间导航并不是一种很好的做法。一定要经常使用
另见:
when-should-i-use-houtputlink-instead-of-hcommandlink
Post-Redirect-Get pattern