2012-12-28 148 views
0

我有REST API,用於訪問「當事人」和URL的這個樣子的:在REST資源的Spring MVC授權

/parties 
/parties/{partyId} 

使用Spring控制器和@PathVariable我能夠實現這個接口。但是,爲了防止用戶訪問當事人,他們沒有獲得,我要檢查添加到方法調用這是一種重複自己,我可能會忘記到處添加:

@RequestMapping(value="/parties/{partyId}", method=RequestMethod.GET) 
public @ResponseBody Party getParty(@PathVariable Integer partyId){ 
    authorizeForParty(partyId); 
    ... 

現在什麼我願做的是創建一個檢查那被稱爲每一個用戶輸入網址這樣的時刻:

/parties/{partyId}/** 

我怎麼會做這樣的事?我必須創建一些servlet過濾器並自己解析網址嗎?如果我必須分析網址,那麼是否有至少一些工具可以讓它變得簡單?我希望有一種方法可以添加一個方法到控制器,但會在方法之前調用,但仍然可以使用@PathVariables等...

+0

https://github.com/JamesEarlDouglas/barebones-spring-mvc/tree/master/reference/secure-rest#a-secure-restful-web-service – NimChimpsky

+0

對不起,但我不明白這有助於所有。那裏的例子已經在控制器方法中完成了授權。我不想在那裏這樣做,因爲我可能會忘記其中之一。 – palto

回答

2

我最終使用的是使用Spring MVC攔截器和解析路徑變量就像Spring一樣。所以我定義了一個攔截器的REST URL:

<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/parties/*/**" /> 
     <bean class="PartyAuthorizationInterceptor" /> 
    </mvc:interceptor> 
</mvc:interceptors> 

的PartyAuthorizationInterceptor必須實現中,我們必須實現preHandle HandlerInterceptor接口。它有HttpServletRequest作爲參數,所以我們可以得到請求的URL,但我們仍然需要從url解析partyId。在閱讀Spring MVC如何完成它之後,我發現他們有一個名爲org.springframework.util.AntPathMatcher的類。它可以從URL中讀取路徑變量,並將這些值放入地圖中。該方法稱爲extractUriTemplateVariables。

所以結果看起來是這樣的:

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
    String partyIdStr = new AntPathMatcher().extractUriTemplateVariables("/parties/{partyId}/**", request.getPathInfo()).get("partyId"); 
    ... 

這使得解析幾乎在MVC控制器方法使用@PathVariable一樣簡單。您仍然必須自己進行轉換(例如,字符串 - >整數)。

現在我可以在訪問該攔截器中的一方的所有URL上實現授權邏輯,並將該邏輯保留在單獨的控制器方法之外。並不像我希望的那麼容易,但它完成了工作。

1

您是否已經在應用程序中使用某種安全庫, G。 Spring Security?

因爲您要實施的邏輯類型是認證鏈中AccessDecisionVoter的經典案例。您只需將您的API放在Spring Security的保護之下,並將自定義檢查作爲安全鏈的一部分來實施。

如果根本沒有使用安全框架,那麼實施HandlerInterceptor的想法可能是最好的選擇。但是它會要求你(如你所提到的)考慮到用戶爲了獲得對其他URL的訪問而可能使用的各種混淆(例如字母%編碼,../../模式等)。

+0

Infact我使用Spring Security,但我只用它進行身份驗證。我必須檢查AccessDecisionVoter是否可以使用它 – palto

+0

Btw +1爲我的要求找到一個解決方案,而不只是回答我的問題:) – palto