2014-02-05 46 views
1

我對構建的Jersey/Spring RESTful Web應用程序有問題。我想使用@PreAuthorize註釋來保護我的端點。但是,我需要訪問UriInfo,因爲我使用查詢參數。Spring Security @PreAuthorize打破Jersey @Context UriInfo注入

一切工作正常,直到我確保方法,然後突然我的UriInfo爲空。我相當肯定這與@PreAuthorize如何導致事物被限定範圍有關 - 不再處於請求級別。

@Component 
@Path("/equipment") 
public class Equipment 
{ 
    @Context 
    UriInfo ui; 

    @PreAuthorize("hasAnyRole('ROLE_ANALYST', 'ROLE_DEVELOPER')") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public def list() { 
     println ui 
     return [:] 
    } 

} 

下面的簡單類將打印「null」。

如果刪除@PreAuthorize註解,你會得到預期的結果 - [email protected]

基於事情我已經在其他問題見過,讓我在說推進我的應用程序上下文已經有這樣一行:

<security:global-method-security pre-post-annotations="enabled"/>

和授權部分工作完美。這只是UriInfo的注入失敗。

我使用Spring 3.1.4和Jersey 2.3。提供的代碼在Groovy中,但這不是問題。

謝謝你的幫助。

+0

我認爲它是導致問題的bean範圍,我可能會脫離基礎。我使用了@Scope(「request」),並用println確認了每次請求都會得到一個新的設備實例,但UriInfo仍然爲空。嘗試它作爲會話範圍,同一個實例,仍然爲空。我可能會在這裏咆哮錯誤的樹。 – JSager

回答

2

所以,我想出了一個解決方案,讓我解決我的問題,我將它留在這裏作爲後代。答案並不能滿足所有的「爲什麼」,但它確實使我的應用程序能夠正常工作,而且它不是真正的麻煩。

不是在類級別注入UriInfo,而是在方法級別注入它。我從here得到了這個想法。他們的解釋是,如果方法簽名可能被修改,請在那裏注入。我猜春安是這樣做的,但我不明白爲什麼會打破在課堂上注入的東西。爲後人

工作代碼:

@PreAuthorize("hasAnyRole('ROLE_ANALYST', 'ROLE_DEVELOPER')") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public def list(@Context UriInfo ui) { 
    ... 
} 
+0

您是否試圖更多地調查這個問題(或者向Spring Security開發人員詢問這個問題)?我有同樣的問題,並且由於其他一些要求,我無法在方法級別注入UriInfo。 – pWoz

+0

@pWoz對不起,這個回覆遲了,但沒有我沒有。我們最終拋棄了Groovy的Clojure和Jersey for Compojure。 – JSager

1

我碰到同樣的問題,並已與現在戰鬥了幾個星期。儘管如此,建議的解決方法對於我的用途並不實用。

我見過的另一個解決方法是將@PreAuthorize註釋向下移動到服務層(或其他應用程序層),而不是直接在其他資源上使用它。這種解決方案對我來說也不實用,但我認爲我會把它作爲另一種可能性加入。

+0

我對澤西島提出了一個關於這個問題的錯誤(https://java.net/jira/browse/JERSEY-2919),儘管它可能是春季或春季安全問題。 – Richard

相關問題