我正在使用弹簧控制器并为其添加授权和身份验证。 Spring控制器使用HATEOAS,我应该简单地添加一个服务来验证请求头中的会话ID。
使用Spring安全性似乎不合适,因为我要求外部服务基于资源进行身份验证和授权。但资源的授权发生在数据库内的元数据上。
我正在寻找一种简单而最佳的做法。
我有以下弹簧控制器端点:
@ApiOperation(value = "Gets a bucket's metadata by ID")
@ApiResponses(value = { @ApiResponse(code = 404, message = "Bucket not found"),
@ApiResponse(code = 401, message = "User not authenticated"),
@ApiResponse(code = 403, message = "Permission denied"), })
@RequestMapping(value = "/{bucketId}", method = GET)
public BucketMetadata getMetadata(
@ApiParam(value = "sessionID", required = true) @RequestHeader(value = "sessionID", required = true) String sessionId,
@PathVariable long bucketId) throws NotAuthenticatedException, AccessDeniedException {
restApiAccessService.checkAccessBySessionIdAndThrowIfDeclined(sessionId, bucketId);
return bucketService.getBucketMetadata(bucketId);
}
该服务依赖于验证sessionId的微服务,以及验证对bucketId的访问的授权服务。
1)我还没有看到在控制器中使用会话ID的spring示例。我可以改进那种设计吗?
我在端点中询问会话ID的原因是因为HATEOS链接正在访问本身需要会话ID的Controller。
linkTo(methodOn(CatalogObjectController.class).getRaw(sessionId,bucketId,URLEncoder.encode(name,"UTF-8")));
上面的代码看起来并不正确,迫使我处理未经过身份验证和未经授权的异常。
我会对任何类型的示例或输入感到高兴,以帮助我创建简洁,简洁,可维护的解决方案。
谢谢你, 托拜厄斯