簡體   English   中英

行為應該因服務或 controller 級別的授權而改變?

[英]Behaviour should change due to authorization at service or controller level?

我想獲取一些資源,我希望根據連接的用戶有 2 種不同的行為。 如果用戶是管理員,他會檢索所有資源,否則他只會檢索他可以訪問的資源。

關於這種情況有什么建議嗎? 最好的方法是什么?為什么?

以下是我發現的不同選項:

  1. 在controller層:
@GetMapping(value = "/myresources")
public void exportKdSchema(HttpServletResponse response) {
    User user = getConnectedUser();
    if(user.isAdmin()) {
        resourceService.getAllResources();
    }
    else {
        resourceService.getAllResourcesByUser(user);
    }
}
  1. 在服務層面:
@GetMapping(value = "/myresources")
public void exportKdSchema(HttpServletResponse response) {
    User user = getConnectedUser();
    resourceService.getResourcesByUser(user)
}

@Service 
public class ResourceService{
    public List<Resource> getResourcesByUser(User user) {
        if(user.isAdmin()) {
            resourceRepository.findAll()
        }
        else {
            resourceRepository.findAllByUserId(user.getId())
        }
    }
}
  1. 我應該創建 2 個控制器嗎:
@PreAuthorize("hasRole('RESOURCES_ALL')")
@GetMapping(value = "/myresources")
public void exportKdSchema(HttpServletResponse response) {
    resourceService.getAllResources();        
}

@GetMapping(value = "/myresources/{userId}")
public void exportKdSchema(@PathVariable("userId") Long userId) {
    resourceService.getAllResourcesByUser(user);
}

對於應該如何完成,您可能會得到很多不同的意見。 我個人會為用戶和管理員功能創建兩個不同的端點:

/resources/my/admin/resources/{userId}

考慮一下某些管理員(您的客戶)也可能將系統用作簡單用戶的情況。 系統管理和正常使用是兩個不同的用例,所以我不會將它們混合在一起。

此外,您還可以從獨立於用戶角色的端點獲得更多可預測的響應。

根據您可能需要的訪問控制粒度,前綴/admin端點還可能允許更容易的配置。

暫無
暫無

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

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