将用户名从 Nginx 传递或写入应用程序

Posted

技术标签:

【中文标题】将用户名从 Nginx 传递或写入应用程序【英文标题】:pass or write the username from Nginx into an app 【发布时间】:2021-12-28 21:07:08 【问题描述】:

嗨,我是nginx 的绝对初学者!我在闪亮的服务器前使用 Nginx 作为反向代理,并认识到 Nginx 写入了两个文件 htmllog。在access.log 我可以看到用户名。我的 Nginx 配置文件的重要部分包含这部分

http 
    server_tokens off;
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/nginx_shiny_access.log;

    sendfile    on;
    keepalive_timeout 65;
    auth_ldap_cache_enabled on;
    auth_ldap_cache_expiration_time 10000;
    auth_ldap_cache_size 1000;
 

由于$remote_user,我可以看到logs/nginx_shiny_access.log中的用户名。

我如何获取html 文件中的用户名并且只是临时,因为我需要应用程序中的用户名但我不知道如何获取它们? 提前谢谢你。

【问题讨论】:

嗨,检查一下如何在 nginx 中转发自定义标头,serverfault.com/questions/391554/…,这将向您展示如何在闪亮的应用程序中访问它,***.com/questions/42442936/… 这不是 nginx 工作。 $remote_user nginx 变量包含基本身份验证提供的用户名。它是一个后端 Web 应用程序,可以检查 Authorization HTTP 标头值并在生成 HTML 文档时使用它。 【参考方案1】:

在反向代理的情况下,nginx.conf一般有如下结构:

http ...
...
   ldap_server MY_WEBSITE 
       url ...
        binddn ...;
        binddn_passwd ...;
        group_attribute member;
        group_attribute_is_dn on;
                           
    server 
        listen 443 ssl http2;
        server_name  localhost *.example.com;
        ssl_certificate     /apps/my.cer;
        ssl_certificate_key /apps/my.key;
        proxy_max_temp_file_size 0;
        add_header xv-nginx-remote_user $remote_user;
           

新是add_header xv-nginx-remote_user $remote_user;

然后,可以在ui.R中定义一个java脚本函数:

library(shinyjs)
library(shiny)
    
    shinyUI(fluidPage(
      
    useShinyjs(),  # Set up 
    tags$script('
        shinyjs.init = function() 
        var client = new XMLHttpRequest();
        client.open("GET", "" , true);
        client.send();
        return client.onreadystatechange = function() 
        var remote_user = client.getResponseHeader("xv-nginx-remote_user");
        Shiny.onInputChange("USERNAME", remote_user);
        ;
      '),
      
      verbatimTextOutput("USERNAME")
      
))

并且必须在server.R 中询问 LDAP 组中的成员

     if(Sys.info()["sysname"] == "Linux") 
        ldap.members <- paste("ldapsearch -LLL -x -h dcwi.org.com -b \"dc=org,dc=com\" -D \
"CN=",Sys.getenv("ldaptu"),",OU=...,DC=org,DC=com\" -w ",Sys.getenv("ldappwd"),"\"CN=....\" member")
        ....
       

【讨论】:

以上是关于将用户名从 Nginx 传递或写入应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7.3,共享扩展,似乎无法将数据从扩展传递到容器应用程序

Kubernetes Nginx-Ingress oauth_proxy如何将信息/令牌传递给服务

将文件从 docker 容器写入 AWS 上的主机实例

将 JSON 从 Nginx 传递到 Gunicorn

从 Gradle 将系统属性传递到 Spring Boot

将 $ssl_client_s_dn 从 nginx/uwsgi 传递到烧瓶应用程序