微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在spring boot容器中获取lambda授权器添加的自定义上下文信息? AWS Apigateway HTTP API

如何解决如何在spring boot容器中获取lambda授权器添加的自定义上下文信息? AWS Apigateway HTTP API

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

解决方法

Custom Authorizer's 上下文将作为 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 进行测试的,但它们仍应是标头的一部分,名称可能略有不同。

,

enter image description here

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。