0

我们正在使用 AWS ECS 服务运行一个容器,我们正在该容器中运行 Spring Boot 应用程序。这是使用 AWS Apigateway HTTP API 公开的。此 AWS Apigateway HTTP API 使用 lambda 授权方进行保护。现在我想在 lambda 授权器中为每个请求添加一些信息,并且我想在 Spring Boot 应用程序方法中访问该信息。我怎样才能做到这一点?

4

2 回答 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 回答
0

在此处输入图像描述

我们必须在 lambda 授权方的响应中将上下文字段设置为对象(键值对)。

然后,我们必须设置参数映射,如图所示。之后,我们可以使用 Balu Vyamajala 的代码在 Spring Boot 控制器的方法中获取这些值。

于 2021-03-08T11:13:25.237 回答