【发布时间】:2022-04-22 05:51:16
【问题描述】:
我的公司使用 LDAP 服务器针对 Active Directory 进行身份验证。我需要使用它对远程托管的 Shiny 应用程序的用户进行身份验证。我设法在 Python 中进行身份验证,但需要将其移植到 R:
import ldap
from getpass import getpass
username = "user_name"
password = getpass(prompt='Password: ', stream=None)
ldap_server = "ldap://company-ldap-server:636"
try:
# Create connection with LDAP server and set options
conn = ldap.initialize(ldap_server)
conn.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
conn.set_option(ldap.OPT_X_TLS_NEWCTX, 0)
# Authenticate by trying to connect
conn.simple_bind_s(username, password)
# Retrieve this user's name and email (for authorization)
info = conn.search_s("DC=ad,DC=company,DC=com", ldap.SCOPE_SUBTREE, f"cn={username}*")
conn.unbind_s()
except Exception:
print("ERROR: Could not connect")
这是我在 R 中尝试过的:
library(RCurl)
ldap_server <- "ldap://company-ldap-server:636"
user <- "user_name"
RCurl::getURL(ldap_server, .opts=list(userpwd = paste0(user, "@ad.company.com:",
.rs.askForPassword("Password: "))
)
)
我得到的是:
函数错误(类型、msg、asError = TRUE):LDAP 本地:绑定 ldap_result 无法联系 LDAP 服务器
在curlOptions() 中有一些类似于OPT_X_TLS_REQUIRE_CERT 和OPT_X_TLS_NEWCTX 的项目,但带有这些名称的curlSetOpts 似乎都不起作用。
这个question and answer 很接近,但我想验证用户通过安全地传递他们的用户名和密码。
在answer 中,他们试图将 Shiny LDAP 转换为烧瓶(基本上与我的相反)。但我不确定他们在哪里/如何指定auth_active_dir 配置......也许是 R Studio Connect 或 Shiny Open Server Pro。这两个都不是我的选择。
可能是服务器此时已关闭。同时,这些是等价的还是我在 R 代码中遗漏了什么?
# Python
conn = ldap.initialize(ldap_server)
conn.simple_bind_s(username, password)
# R
getURL(ldap_server, .opts=list(userpwd = "...."))
【问题讨论】:
-
不确定您是如何部署应用程序的,但仅供参考:Shiny Server 的商业版本支持 LDAP 身份验证,请参阅this。此外,开源解决方案shinyproxy 提供 LDAP 支持。
-
Shiny Server 的付费版本不太理想,但如果没有其他选择,我可能会去那里。 Shinyproxy 需要 docker,这在以前是一个巨大的痛苦。也许是时候再试一次了
-
有可用于shinyproxy 的示例容器。以这种方式部署/配置我的第一个应用程序(也使用 LDAP)只花了我几个小时。
-
虽然 Shinyproxy 很有趣,但我已经确认 docker 也不是一个选项。
-
不。我一直在通过调用 Python 脚本来处理它,该脚本通过系统调用执行 LDAP 身份验证。使用 reticulate 可能是一种稍微优雅的方法。但这一切都很尴尬。