繁体   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