我们正在使用 AWS ECS 服务运行一个容器,我们正在该容器中运行 Spring Boot 应用程序。这是使用 AWS Apigateway HTTP API 公开的。此 AWS Apigateway HTTP API 使用 lambda 授权方进行保护。现在我想在 lambda 授权器中为每个请求添加一些信息,并且我想在 Spring Boot 应用程序方法中访问该信息。我怎样才能做到这一点?
问问题
328 次
2 回答
1
自定义授权器的上下文将作为 http 标头传递,我们可以简单地记录 http 标头以进行验证。
如果 api 网关授权方返回的策略是
{
"principalId": "user",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:us-east-1:655648606120:nnnn1111ab/mystage/*"
]
}
]
},
"context": {
"userName": "My User Name",
"userId": "myid",
"groups": "Admin,User"
}
}
它们将作为 http 标头传递给后端
package com.test.config.interceptor;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.amway.na.api.model.ApiEnum;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class ApiLoggerInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
ApiEnum api = ApiEnum.get(request.getRequestURI());
if (api.getLoggingRequired()) {
StringBuilder headers = new StringBuilder();
for (Enumeration<?> e = request.getHeaderNames(); e.hasMoreElements();) {
String nextHeaderName = (String) e.nextElement();
String headerValue = request.getHeader(nextHeaderName);
headers.append("[").append(nextHeaderName).append(":").append(headerValue).append("] ");
}
log.debug("Execution of Api Starts: URI {} {}", request.getRequestURI(), headers);
}
return true;
}
}
应该显示
[x-test-user-name:my user name] [x-test-groups:Admin,User] [x-test-user-id:myid] [accept:application/json, text/plain, */*] [accept-encoding:gzip, deflate, br] [accept-language:en-US,en;q=0.9] [authentication:Beare...
这是针对 REST API 而不是 HTTP Api 进行测试的,但它们仍然应该是标头的一部分,名称可能略有不同。
于 2021-03-04T14:55:03.940 回答