java 行为是否因服务或控制器级别的授权而改变?

xxe27gdn  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(88)

我想获取一些资源,我希望根据连接的用户有两种不同的行为。如果用户是管理员,他会获取所有资源,否则他只会获取他可以访问的资源。
对于这种情况有什么建议吗?最好的方法是什么?为什么?
以下是我找到的不同选项:
1.在控制器级别:

@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);
}
fkaflof6

fkaflof61#

你可能会得到很多不同的意见,应该如何做。我个人会创建两个不同的端点为用户和管理员功能:
/resources/my/admin/resources/{userId}
想一想一些管理员(你的客户)也可能作为一个简单用户使用系统的情况,系统管理和正常使用是两种不同的用例,所以我不会把它们混在一起。
此外,您还可以从独立于用户角色的端点获得更可预测的响应。
前缀/admin端点还可以允许更简单的配置,这取决于您可能需要的访问控制粒度。

相关问题