【发布时间】:2012-02-28 22:20:38
【问题描述】:
Servlet 2.4+ API 允许我们在 <filter-mapping> 标记中使用 <dispatcher> 标记和 FORWARD 之类的值来拦截内部转发到其他资源的请求。对于一个 servlet 转发到另一个,spring 安全约束工作正常。
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
问题: 安全过滤器似乎不会使用 JSF Actions
拦截内部转发JSF 似乎在使用 JSF 操作(导航案例)时将请求“转发”到目标视图(页面)。这会导致 URL 比页面的实际 URL 落后一步。
这样做的副作用是 spring 安全约束(与 URL 绑定)在下一个操作之前不会生效。
示例: 当前页面网址:http://host/myapp/page1.xhtml (page1.xhtml 有一个导航到受保护的 page2 的操作)
提交时,请求被提交到呈现 page2.xhtml 的服务器,但 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 config xml的相关sn-p)
<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>
【问题讨论】:
-
你也可以发布你的applicationContext.xml
-
@Ravi 使用 appcontext.xml 中的内容编辑了问题有什么想法吗?
标签: java jsf spring-security