2015-11-13 98 views
1

關於如何設置JAX-RS API,有很多很好的資源和文獻資料。但是,我還沒有找到任何資源能夠恰當地描述如何對特定資源和方法進行安全限制。例如,給定資源PictureResource,只有圖片上傳者(和管理員)應該能夠刪除或更改與圖片相關的屬性,而任何人都應該能夠查看圖片。管理員限制是好的,因爲它可以通過roles解決,但是上傳者將取決於呼叫的上下文。然後標識用戶的令牌將描述誰正在進行呼叫。這可以通過ContainerRequestFilter來解決。JAX-RS和資源所有權限制

@Path("pictures/{pictureId}") 
public class PictureResource { 

    @GET 
    public Response getPicture(@PathParam("pictureId") final int pictureId) { 
     // Get the picture, available for all users. 
    } 

    @DELETE 
    public Response deletePicture(@PathParam("pictureId") final int pictureId) { 
     // Delete the picture, only available for the uploader of the picture and admins. 
    } 

    // ... 
} 

解決此問題的JAX-RS方式是什麼?我假設這可以通過註釋來解決,但是對於我來說這非常模糊。另一種方法是根據呼叫的上下文動態地爲用戶分配一個pictureOwnerRole?

+0

你見過[這](http://stackoverflow.com/q/26777083/2587435) –

+0

該職位幾乎是第二個鏈接我在我的崗位了,但更多的闡述。就我而言,我想根據調用的上下文進行限制。例如,登錄的用戶AND是允許刪除圖片的圖片的上傳者。 – Martin

+0

由於您知道呼叫您的終端用戶以及上傳圖片的用戶,因此我認爲您的方法中會出現一個簡單的「if」條件。而且,如果用戶不允許執行該操作,只需拋出['ForbiddenException'](http://docs.oracle.com/javaee/7/api/javax/ws/rs/ForbiddenException.html)。 –

回答

2

問題是離散資源訪問控制。您需要一種標準方式來描述所有權所訪問的資源。誰擁有這個資源,誰擁有這個資源的範圍。

的問題是,這是非常具體的領域。資源分組和所有權需要查找資源實例或關聯元數據並確定所有權/訪問需求的能力。

我不知道,爲此提供一個標準的框架或標註任何安全框架。

你可以把圖片放到一個目錄結構和使用目錄的訪問控制,以確定哪些用戶具有對資源的訪問什麼。

@Secured("ownerDecider=PictureInspector.class")東西是我會怎麼處理它。春季安全中的AccessDecisionVoterAfterInvocationProvider然後可以使用所提供的策略來辨別所有權,並相應地限制訪問。