【问题标题】:How to Authenticate with LDAP in R Shiny App如何在 R Shiny App 中使用 LDAP 进行身份验证
【发布时间】: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_CERTOPT_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 可能是一种稍微优雅的方法。但这一切都很尴尬。

标签: python r shiny ldap


【解决方案1】:

你的 url (ldap_server) 格式不够。你试试怎么样: 关注这里的帖子:How do I run a ldap query using R?

ldap_server <- "ldap://company-ldap-server:636/OU=[value],dc=ad,dc=company,dc=com?cn,mail?sub?filter"
  • 删除括号替换 [value] 为您的 OU(对我来说是公司)。
  • sub 是作用域(base/one/sub)作为值
  • 将“cn,mail”替换为您要查询的任何属性
  • filter 是搜索过滤器,制作查询的子集:eg(sn=LastName)。

查看https://docs.oracle.com/cd/E19396-01/817-7616/ldurl.html 获取 curl 网址。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 2021-09-02
    • 2014-02-28
    • 1970-01-01
    • 2015-10-03
    • 2014-03-08
    • 2014-08-09
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多