有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    默认情况下,FilterSecurityInterceptor只会在每个请求中执行一次,并且不会执行安全性重新检查,除非url中有更改,但使用JSP/JSF转发时,页面将作为对当前请求的响应呈现,并且浏览器中的url包含上一页的地址。为此,只需在applicationContext中的http元素中将“每个请求一次”属性设置为false,从而强制重新检查安全性

    <http auto-config="true" use-expressions="true" once-per-request="false">
    

    并在springSecurityFilterChain过滤器映射中添加转发调度程序。xml

    <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>
    

    更多info

    或者,您也可以通过在结果后面附加参数faces redirect=true来启用页面重定向,如下所示:

    <h:form>
        <h:commandButton action="page1?faces-redirect=true" value="Page1" />
    </h:form>
    

    但是正如BalusC所说的,使用POST进行页面间导航并不是一种很好的做法。一定要经常使用

    <h:link> or <h:button>
    

    另见: