Djangoenviron在.env中管理LDAP DN

2024-05-14 14:14:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在使用django-environ来管理我的环境变量,这样我就可以修改DL组列表,这些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 Enviro,您可以像下面这样阅读.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管理列表

多谢各位


Tags: djangoinenvcomsettingsourequirementdc
2条回答

有时,请一晚假可以为原本简单的问题提供一个简单的解决方案。。呵呵

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

# .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(';')

这是关于如何将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值放入数据库中的表中

相关问题 更多 >

    热门问题