#amazon-web-services #spring-boot #lambda-authorizer
#amazon-web-services #spring-boot #lambda-authorizer
Вопрос:
Мы используем сервис AWS ECS для запуска контейнера, мы запускаем приложение spring boot в этом контейнере. Это доступно с помощью AWS Apigateway HTTP API. Этот AWS Apigateway HTTP API защищен с помощью lambda authorizer. Теперь я хочу добавить некоторую информацию к каждому запросу в lambda authorizer, и я хочу получить доступ к этой информации в методе приложения spring boot. Как я могу это сделать?
Комментарии:
1. они должны быть просто частью http-заголовков, вы регистрировали заголовки, чтобы проверить, существуют ли заголовки контекста?
2. вместо того, чтобы записывать ее в lambda authorizer, вы можете записать ее в APIGateway и делегировать ее конкретному запросу
Ответ №1:
Контекст пользовательского авторизатора будет передан как http-заголовки, и мы можем просто зарегистрировать http-заголовки для проверки.
если политика, возвращаемая авторизатором api gateway, является
{
"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, но они все равно должны быть частью заголовков, имена могут немного отличаться.