我想获取一些资源,我希望根据连接的用户有两种不同的行为。如果用户是管理员,他会获取所有资源,否则他只会获取他可以访问的资源。
对于这种情况有什么建议吗?最好的方法是什么?为什么?
以下是我找到的不同选项:
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);
}
1条答案
按热度按时间fkaflof61#
你可能会得到很多不同的意见,应该如何做。我个人会创建两个不同的端点为用户和管理员功能:
/resources/my
和/admin/resources/{userId}
想一想一些管理员(你的客户)也可能作为一个简单用户使用系统的情况,系统管理和正常使用是两种不同的用例,所以我不会把它们混在一起。
此外,您还可以从独立于用户角色的端点获得更可预测的响应。
前缀
/admin
端点还可以允许更简单的配置,这取决于您可能需要的访问控制粒度。