服務端指南 | 基於資料的訪問控制

樑桂釗發表於2019-03-03

原文地址:服務端指南 | 基於資料的訪問控制

部落格地址:blog.720ui.com/

基於角色的訪問控制,只驗證訪問資料的角色,但是沒有對角色內的使用者做細分。舉個例子,使用者甲與使用者乙都具有用一個角色,但是如果只建立基於角色的訪問控制,那麼使用者甲可以對使用者乙的資料進行任意操作,從而發生了越權訪問。因此,在業務場景中僅僅使用基於角色的訪問控制是不夠的,還需要引入基於資料的訪問控制。如果將基於角色的訪問控制視為一種垂直許可權控制,那麼,基於資料的訪問控制就是一種水平許可權控制。在業務場景中,往往對基於資料的訪問控制不夠重視,舉個例子,評論功能是一個非常常見的功能,使用者可以在客戶端發起評論,回覆評論,檢視評論,刪除評論等操作。一般情況下,只有本人才可以刪除自己的評論,如果此時,業務層面沒有建立資料的訪問控制,那麼使用者甲可以試圖繞過客戶端,通過呼叫服務端RESTful API 介面,猜測評論 ID 並修改評論 ID 就可以刪除別人的評論。事實上,這是非常嚴重的越權操作。除此之外,使用者之間往往也存在一些私有的資料,而這些私有的資料在正常情況下,只有使用者自己才能訪問。

基於資料的訪問控制,需要業務層面去處理,但是這個也是最為經常遺落的安全點,需要引起重視。這裡,再次使用刪除評論的案例,通過 Java 語言進行介紹。在這個案例中,核心的程式碼片段在於,判斷當前使用者是否是評論的建立者,如果是則通過,不是則報出沒有許可權的錯誤碼。那麼,這樣就可以很好地防止資料的越權操作。

@RestController
@RequestMapping(value = {"/v1/c/apps"})
public class AppCommentController{
    @Autowired
    private AppCommentService appCommentService;

@RequestMapping(value = "/{appId:\\d+}/comments/{commentId:\\d+}", 
method = RequestMethod.DELETE)
public void deleteAppCommentInfo(@PathVariable Long appId, 
    @PathVariable Long commentId,
        @AuthenticationPrincipal UserInfo userInfo) {
        AppComment appComment = this.appCommentService.checkCommentInfo(commentId);
        
// 判斷當前使用者是否是評論的建立者,如果是則通過,不是則報出沒有許可權的錯誤碼。
        if(!appComment.getUserId().equals(Long.valueOf(userInfo.getUserId()))){
            throw new BusinessException(ErrorCode.ACCESS_DENIED);
        }
        
        this.appCommentService.delete(commentId);
    }
}
複製程式碼

總結下,基於角色的訪問控制是一種垂直許可權控制,通過建立使用者與角色的對應關係,使得不同角色之間具有高低之分。使用者根據擁有的角色進行操作與資源訪問。基於資料的訪問控制是一種水平許可權控制,它對角色內的使用者做細分,確保使用者的資料不能越權操作。基於資料的訪問控制,需要業務層面去處理,但是這個也是最為經常遺落的安全點,需要引起重視。

擴充套件閱讀:

服務端指南 | 基於角色的訪問控制

服務端指南 | 授權與認證實戰

(完)

更多精彩文章,盡在「服務端思維」微信公眾號!

服務端指南 | 基於資料的訪問控制

相關文章