簡體   English   中英

JSF-春季安全集成問題

[英]JSF - Spring Security Integration issue

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 Action攔截內部轉發

在使用JSF操作(導航用例)時,JSF似乎將請求“轉發”到目標視圖(頁面)。 這導致該URL比該頁面的實際URL落后一步。

這樣做的副作用是,彈簧安全性約束(綁定到URL)在下一個動作之前不會生效。

示例:當前頁面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的相關片段)

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

馬口說起 (Oracle文檔)

如果導航案例不使用redirect元素, 則將新頁面呈現為對當前請求的響應 ,這意味着瀏覽器的address字段中的URL不會更改,並且它將包含上一頁的地址。

這似乎意味着在JSF生命周期中沒有“前進”發生到下一頁……因此Spring Security將永遠無法解決這個問題。

默認情況下,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>

更多資訊

另外,您也可以通過將參數faces-redirect = true附加到結果中來啟用頁面重定向,如下所示:

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

但是正如BalusC所說,使用POST進行頁面到頁面的導航不是一個好習慣。 總是使用GET

<h:link> or <h:button>

另請參閱:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM