Django Admin,如何隐藏更改密码?
Django Admin, how to hide change password?
我的 Django 应用程序的一些用户来自 LDAP 服务器。这些用户不能更改他们的 django-admin 密码。最好的,如果他们连一个都没有。
这就是为什么我将 django_auth_ldap.backend.LDAPBackend
子类化为这样的原因:
from django_auth_ldap.backend import LDAPBackend
from django.contrib.auth import get_user_model
class CustomLDAPBackend(LDAPBackend)
def authenticate_ldap_user(self, ldap_user, password):
user = ldap_user.authenticate(password)
print("BEFORE set_unusable_password(): ", user.has_usable_password())
user.set_unusable_password()
user.save()
print("AFTER set_unusable_password(): ", user.has_usable_password())
return user
user.set_unusable_password()
我试图隐藏密码,因为我在几个地方读过它(这里在 SO 以及 docs 中)。但我所能做到的就是没有设置密码:
此外,如果我多次登录,print("BEFORE set_unusable_password(): ", user.has_usable_password())
的结果始终为 True,尽管调用了 user.set_unusable_password()
并保存了用户。好像每次都会创建一个新的用户对象。
This question does not solve my problem因为user.set_unusable_password()
显然没有隐藏修改密码的区域
我错过了什么?如何隐藏'change password'区域?
下面是 settings.py 的 LDAP 相关部分:
import ldap
from django_auth_ldap.config import LDAPSearch, LDAPGroupQuery,GroupOfNamesType,PosixGroupType
AUTH_LDAP_SERVER_URI = 'ldap://localhost'
AUTH_LDAP_BIND_DN = 'cn=admin,dc=example,dc=com'
AUTH_LDAP_BIND_PASSWORD = 'secret'
AUTH_LDAP_USER_SEARCH = LDAPSearch('dc=example,dc=com',ldap.SCOPE_SUBTREE, '(uid=%(user)s)')
AUTH_LDAP_GROUP_SEARCH = LDAPSearch('dc=example,dc=com',ldap.SCOPE_SUBTREE, '(objectClass=top)')
AUTH_LDAP_GROUP_TYPE = PosixGroupType(name_attr="cn")
AUTH_LDAP_MIRROR_GROUPS = True
# Populate the Django user from the LDAP directory.
AUTH_LDAP_REQUIRE_GROUP = "cn=enabled,ou=groups,dc=example,dc=com"
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",
"last_name": "sn",
"email": "mail",
"username": "uid",
"password": "userPassword",
}
AUTH_LDAP_PROFILE_ATTR_MAP = {
"home_directory": "homeDirectory"
}
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_active": "cn=active,ou=groups,dc=example,dc=com",
"is_staff": "cn=staff,ou=groups,dc=example,dc=com",
"is_superuser": "cn=superuser,ou=groups,dc=example,dc=com"
}
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_FIND_GROUP_PERMS = True
AUTH_LDAP_CACHE_TIMEOUT = 3600
AUTH_LDAP_FIND_GROUP_PERMS = True
# Keep ModelBackend around for per-user permissions and maybe a local
# superuser.
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'ldappro.backend_ldap.CustomLDAPBackend',
)
我终于找到了解决办法。覆盖 'LDAPBackend' 确实是必要的,但还不够。它删除了仅标有红色的 'Changes Password'(右上角):
另一个 'Change Password' 区域(在下图中用蓝色标记)保持完整:
要摆脱 'blue' 区域,我们需要重写这样的模板:
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block field_sets %}
{% for fieldset in adminform %}
{% if forloop.first and user.has_usable_password %}
{% include "admin/includes/fieldset.html" %}
{% endif %}
{% if not forloop.first %}
{% include "admin/includes/fieldset.html" %}
{% endif %}
{% endfor %}
{% endblock %}
这个覆盖模板 html 需要被调用 change_form.html
并且需要放置如下(红色圆圈):
我的 Django 应用程序的一些用户来自 LDAP 服务器。这些用户不能更改他们的 django-admin 密码。最好的,如果他们连一个都没有。
这就是为什么我将 django_auth_ldap.backend.LDAPBackend
子类化为这样的原因:
from django_auth_ldap.backend import LDAPBackend
from django.contrib.auth import get_user_model
class CustomLDAPBackend(LDAPBackend)
def authenticate_ldap_user(self, ldap_user, password):
user = ldap_user.authenticate(password)
print("BEFORE set_unusable_password(): ", user.has_usable_password())
user.set_unusable_password()
user.save()
print("AFTER set_unusable_password(): ", user.has_usable_password())
return user
user.set_unusable_password()
我试图隐藏密码,因为我在几个地方读过它(这里在 SO 以及 docs 中)。但我所能做到的就是没有设置密码:
此外,如果我多次登录,print("BEFORE set_unusable_password(): ", user.has_usable_password())
的结果始终为 True,尽管调用了 user.set_unusable_password()
并保存了用户。好像每次都会创建一个新的用户对象。
This question does not solve my problem因为user.set_unusable_password()
显然没有隐藏修改密码的区域
我错过了什么?如何隐藏'change password'区域?
下面是 settings.py 的 LDAP 相关部分:
import ldap
from django_auth_ldap.config import LDAPSearch, LDAPGroupQuery,GroupOfNamesType,PosixGroupType
AUTH_LDAP_SERVER_URI = 'ldap://localhost'
AUTH_LDAP_BIND_DN = 'cn=admin,dc=example,dc=com'
AUTH_LDAP_BIND_PASSWORD = 'secret'
AUTH_LDAP_USER_SEARCH = LDAPSearch('dc=example,dc=com',ldap.SCOPE_SUBTREE, '(uid=%(user)s)')
AUTH_LDAP_GROUP_SEARCH = LDAPSearch('dc=example,dc=com',ldap.SCOPE_SUBTREE, '(objectClass=top)')
AUTH_LDAP_GROUP_TYPE = PosixGroupType(name_attr="cn")
AUTH_LDAP_MIRROR_GROUPS = True
# Populate the Django user from the LDAP directory.
AUTH_LDAP_REQUIRE_GROUP = "cn=enabled,ou=groups,dc=example,dc=com"
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",
"last_name": "sn",
"email": "mail",
"username": "uid",
"password": "userPassword",
}
AUTH_LDAP_PROFILE_ATTR_MAP = {
"home_directory": "homeDirectory"
}
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_active": "cn=active,ou=groups,dc=example,dc=com",
"is_staff": "cn=staff,ou=groups,dc=example,dc=com",
"is_superuser": "cn=superuser,ou=groups,dc=example,dc=com"
}
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_FIND_GROUP_PERMS = True
AUTH_LDAP_CACHE_TIMEOUT = 3600
AUTH_LDAP_FIND_GROUP_PERMS = True
# Keep ModelBackend around for per-user permissions and maybe a local
# superuser.
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'ldappro.backend_ldap.CustomLDAPBackend',
)
我终于找到了解决办法。覆盖 'LDAPBackend' 确实是必要的,但还不够。它删除了仅标有红色的 'Changes Password'(右上角):
另一个 'Change Password' 区域(在下图中用蓝色标记)保持完整:
要摆脱 'blue' 区域,我们需要重写这样的模板:
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block field_sets %}
{% for fieldset in adminform %}
{% if forloop.first and user.has_usable_password %}
{% include "admin/includes/fieldset.html" %}
{% endif %}
{% if not forloop.first %}
{% include "admin/includes/fieldset.html" %}
{% endif %}
{% endfor %}
{% endblock %}
这个覆盖模板 html 需要被调用 change_form.html
并且需要放置如下(红色圆圈):