gpt4 book ai didi

spring-boot - 如何使用 Kubernetes Ingress 执行自定义身份验证

转载 作者:行者123 更新时间:2023-12-02 12:26:50 25 4
gpt4 key购买 nike

我在 kubernetes 中部署了一些服务,并使用 NGINX 入口访问外部。(使用 EC2 实例进行所有集群设置)。能够通过与入口绑定(bind)的主机访问服务。现在,我没有直接访问 svc,而是尝试在访问服务之前添加身份验证。并重定向到登录页面,用户输入凭据并应重定向到所询问的页面。到目前为止,我尝试了以下代码片段。请指导寻找解决方案。
我的入口.yml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: mynamespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/session-cookie-name: JSESSIONID
nginx.ingress.kubernetes.io/ssl-passthrough: "false"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
kubernetes.io/ingress.class: "nginx"
kubernetes.io/ingress.allow-http: "false"
nginx.ingress.kubernetes.io/auth-signin: "https://auth.mysite.domain/api/auth/login" #will show login page
nginx.ingress.kubernetes.io/auth-url: "https://auth.mysite.domain/api/auth/token/validate"
nginx.ingress.kubernetes.io/auth-response-headers: "authorization"

spec:
tls:
- hosts:
- mysite.domain
#secretName: ${TLS_TOKEN_NAME}
rules:
- host: a.mysite.domain
http:
paths:
- path: /
backend:
serviceName: myservice1
servicePort: 9090

所以首先它会调用“/token/validate”并获得未经授权,然后进入“auth/login”并显示登录页面
输入凭据后转到“/token/validate”并再次登录页面。实际上应该重定向到被调用的页面。
如何实现这一点?[如果在成功验证后,如果我们可以在调用的 ling 中添加 header ,我认为可以解决但不知道如何解决]
后端:Java Spring
@RequestMapping("login")  
public String login() {
return "login.html";
}
登录.html
    <form action="validate-user" method="post" enctype="application/x-www-form-urlencoded">  
<label for="username">Username</label>
<input type="text" id="username" value="admin" name="username" autofocus="autofocus" /> <br>
<label for="password">Password</label>
<input type="password" id="password" value="password" name="password" /> <br>

<input id="submit" type="submit" value="Log in" />
</form>
后端:Java Spring
@PostMapping("validate-user")
@ResponseBody
public ResponseEntity<?> validateUser(HttpServletRequest request, HttpServletResponse response) throws Exception {
...

HttpStatus httpStatus=HttpStatus.FOUND;
//calling authentication api and validating

//else
httpStatus=HttpStatus.UNAUTHORIZED;
HttpHeaders responseHeaders= new HttpHeaders();
responseHeaders.set("Authoriztion", token);

//responseHeaders.setLocation(new URI("https://a.mysite.domain")); ALSO TRIED BUT NOT WORKED
return new ResponseEntity<>(responseHeaders,httpStatus);

}
更新1:我正在使用我自己的自定义身份验证 api,如果我使用来自 postman 的自定义 header “授权”:“承载 token ”点击 url,那么响应是可以的,但来自浏览器的响应是不可能的,所以只能来自上游 svc(成功登录后) header 应该包含在重定向页面中,我们该怎么做?
我缺少任何注释吗?
更新2:在成功验证后重定向时,我将 token 作为查询字符串传递,例如 responseHeaders.setLocation(new URI("https://a.mysite.domain/?access_token="+token)并在重定向后进行验证。成功验证后转到下游 svc [预期]。但是当那个 svc 正在路由时说 a.mysite.domain/route1然后查询字符串消失了,auth svc 无法获取 token ,因此 401再次。应该是 a.mysite.domain/route1/?access_token=token .有什么办法可以做到吗?如果每条路线都有相同的查询字符串,那么将起作用。[这是我的 PLAN-B ......但仍然 passwing token 是标题是我的优先事项]
更新3:我尝试使用以下注释:
nginx.ingress.kubernetes.io/auth-signin: 'https://auth.example.com/api/auth-service-ui/login'
nginx.ingress.kubernetes.io/auth-response-headers: 'UserID, Authorization, authorization'
nginx.ingress.kubernetes.io/auth-snippet: |
auth_request_set $token $upstream_http_authorization;
proxy_set_header Foo-Header1 $token; //not showing as request header AND this value only need LOOKS $token val is missed
proxy_set_header Foo-Header headerfoo1; //showing as request header OK
more_set_input_headers 'Authorization: $token';//not showing as request header AND this value only need LOOKS $token val is missed

nginx.ingress.kubernetes.io/configuration-snippet: |
auth_request_set $token1 $upstream_http_authorization;
add_header authorization2 QQQAAQ1; //showing as response header OK no use
add_header authorization $token; //showing as response header OK how to send as request header on next call
more_set_input_headers 'Authorization11: uuu1';//showing as request header in next call
more_set_input_headers 'Authorization: $token1';//not showing as request header and need this val ONLY
**我错过了什么注释?
更新4
PLAN-C:现在尝试将 jwt token 存储在 cookie 中。
 nginx.ingress.kubernetes.io/configuration-snippet: |
auth_request_set $token5 $upstream_http_authorization;
add_header Set-Cookie "JWT_TOKEN=$token5";
在每个请求中都设置了相同的 cookie,但在浏览器中每次都存储它。即多个相同的cookie。如何只设置一次?

最佳答案

将 Oauth2-proxy 与 nginx 入口 Controller 集成,以启用对入口后面运行的服务的自定义身份验证。
点击链接 --> https://github.com/oauth2-proxy/oauth2-proxy

关于spring-boot - 如何使用 Kubernetes Ingress 执行自定义身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62770975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com