【问题标题】:django-environ - Managing LDAP DN in .envdjango-environ - 在 .env 中管理 LDAP DN
【发布时间】:2021-07-13 14:11:43
【问题描述】:

我有一个 django web 应用程序,它带有一个中间件,可以拦截传入的请求,在请求标头中提取用户详细信息(由上游中间件添加到标头),并检查用户是否有权访问该页面,如果用户是分发组。

我正在使用django-environ 来管理我的环境变量,因此我可以修改可以访问我的页面的 DL 组列表,而无需更改代码。

# in Middleware, only included important part of code
from django.conf import settings

MINIMAL_MEMBERSHIP = settings.AUTHORIZED_MEMBERSHIP_REQUIREMENT # This should pass in as a list
server_object = Server(LDAP_SERVER)
conn = Connection(server_object, LDAP_USER, LDAP_PASS, client_strategy=SAFE_SYNC, auto_bind=True)
status, result, response, _ = conn.search(
            search_base=requester_dn,
            search_filter = '(objectClass=User)',
            attributes = ['memberOf']
            ) 

authorized = False
requester_membership_list = response[0]['raw_attributes']['memberOf']
for membership in requester_membership_list:
    ad_group_name = membership.decode('utf-8')
    if ad_group_name in MINIMAL_MEMBERSHIP:
        authorized = True
        break
# In settings.py

AUTHORIZED_MEMBERSHIP_REQUIREMENT = env.list('AUTHORIZED_MEMBERSHIP_REQUIREMENT')

# In .env 
AUTHORIZED_MEMBERSHIP_REQUIREMENT="CN=Virtualisation team,OU=Distribution Group,OU=Exchange,OU=APPS,DC=xxx,DC=xxx,DC=xxx,DC=com",

根据 django-environ,您可以将 .env 读取为类似列表的列表

# .env
LIST_ENV=one,two,three,four

# settings.py
LIST_ENV=env.list(LIST_ENV)
print(LIST_ENV) # outputs ['one', 'two', 'three', 'four']

但可以理解,ldap DN 格式会破坏这一点,因为完整的 DN 已经用逗​​号分隔,所以:

# .env
DN_LIST="CN=1,OU=1,OU=1,OU=1,DC=xxx,DC=xxx,DC=xxx,DC=com","CN=2,OU=2,OU=2,OU=2,DC=xxx,DC=xxx,DC=xxx,DC=com"
# settings.py
DN_LIST=env.list(DN_LIST)

# Actual Behavior
print(DN_LIST) 
# DN_LIST = ['CN=1', 'OU=1', 'OU=1', ...]
# len(DN_LIST) will output 16

我想实现这个:

# Behavior i want
print(DN_LIST) 
# DN_LIST = ["CN=1,OU=1,OU=1,OU=1,DC=xxx,DC=xxx,DC=xxx,DC=com","CN=2,OU=2,OU=2,OU=2,DC=xxx,DC=xxx,DC=xxx,DC=com"]
# len(DN_LIST) will output 2

如果我需要添加/删除新组,是否有任何方法可以在不修改代码的情况下从 .env 管理列表?

谢谢

【问题讨论】:

    标签: python django ldap environment-variables ldap3


    【解决方案1】:

    这是关于如何将 shell 环境变量 (.env) 读入 python

    DN_LIST="CN=1,OU=1,OU=1,OU=1,DC=xxx" ## instead this 
    
    DN_LIST_NEW='["CN=1,OU=1,OU=1,OU=1,DC=xxx","CN=2,OU=2,OU=2,OU=2,DC=xxx"]' ## please you this 
    
    

    题外话:在.env中定义这些DN意味着如果我们想改变DN值,我们必须在.env**restart/deploy**应用程序中改变,这不好。您应该考虑将这些 DN 值放入数据库中的表中

    【讨论】:

      【解决方案2】:

      有时晚上休息可以为原本简单的问题提供一个简单的解决方案……呵呵。

      决定将 .env 中的 DN 列表作为字符串,并将 DN 用某些东西(例如;)分隔,然后手动将其拆分/处理成一个列表。

      # .env
      AUTHORIZED_MEMBERSHIP_REQUIREMENT=CN=1,OU=1,OU=1,OU=1,DC=xxx,DC=xxx,DC=xxx,DC=com;CN=2,OU=2,OU=2,OU=2,DC=xxx,DC=xxx,DC=xxx,DC=com
      
      # .settings.py
      AUTHORIZED_MEMBERSHIP_REQUIREMENT = env.str('AUTHORIZED_MEMBERSHIP_REQUIREMENT').split(';')
      

      【讨论】:

      • 如果 dn 包含分号怎么办?为什么不直接使用 dn 列表而不是拆分字符串?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多