我的问题与现有的SO帖子非常相似:
JSF - Spring Security Integration issue
Ravi关于禁用每次请求一次并指定FORWARD以“让它工作”的回应在网上的其他地方回应,即:
http://www.coderanch.com/t/61490/oa/Spring-security-intercept-url
很久以前:
http://forum.springsource.org/showthread.php?11025-lt-jsp-forward-gt-bypasses-Acegi
然而,我只是无法让它发挥作用。我已经完成了Ravi的回复建议的两个项目:
1)在spring的配置中每次请求一次:
<http auto-config="true" use-expressions="true" once-per-request="false">
<intercept-url pattern="/partners/**" access="ROLE_PARTNER" />
.
.
.
</http>
2)包括FORWARD:
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
在我的情况下,我有一个命令链接到我的应用程序的合作伙伴部分工作(但不应该)。 是真的,在第一个之后的每个链接和发布的任何搜索都不起作用。但初始导航到/ parterns / **确实有效,我认为不应该这样做。
<p:menuitem>
<h:commandLink ajax="false" action="/partners/search/partnerSearch"
styleClass="ui-menuitem-link
ui-corner-all">
<h:outputText value="Partners"/>
</h:commandLink>
</p:menuitem>
我假设这意味着JSF实际上并没有使用请求调度程序来“转发”到导航结果(因此,Spring永远不会有机会重新评估安全性)。我已经尝试过放置断点并寻找自己,但这有点超出了我的理解,我所看到的。
我知道我可以使用重定向(但就像我链接的第一个SO帖子一样,不想这样做)。我也知道我可以在菜单项周围添加<sec:ifAnyGranted roles="ROLE_PARTNER">
以防止首先出现点击。
我实际上只是好奇为什么这根本不起作用,当一些消息来源似乎表明应该这样做。
我对它不起作用的体验至少与其他一个地方相呼应: http://forum.springsource.org/showthread.php?82900-FilterSecurityInterceptor-not-being-called-for-a-JSF-forward
我的东西是:
<spring.version>3.1.3.RELEASE</spring.version>
<jsf.version>2.1.23</jsf.version> (mojarra)
<primeFaces.version>3.5.9</primeFaces.version>