我有一个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管理列表
多谢各位
有时,请一晚假可以为原本简单的问题提供一个简单的解决方案。。呵呵
决定将.env中的DN列表作为一个字符串,并用某物(例如
;
)分隔DNs,然后手动将其拆分/处理为一个列表这是关于如何将shell环境变量(.env)读入python的
离题:在
.env
中定义这些DN意味着如果我们想要更改DN值,我们必须在应用程序的.env
和**restart/deploy**
中进行更改,这是不好的。您应该考虑将这些DN值放入数据库中的表中相关问题 更多 >
编程相关推荐