我的设置: Django-3.0,Python-3.8,django_auth_ldap
我的组织中有LDAP服务器()。我正在构建一个Django应用程序,它为所有用户提供一些操作。
我知道Django有内置的用户身份验证机制,但是它可以验证用户是否存在于用户模型数据库中。
,但我的要求是.
所有用户条目都在LDAP服务器()中。使用适当的用户凭据,LDAP服务器将对我进行身份验证。
我在Django 'accounts'应用程序中创建了登录页面,
当我从登录页输入用户名和密码时,
我看到django_auth_ldap包为我的目的提供了一些见解。
我在settings.py.里有这些内容
import ldap
##Ldap settings
AUTH_LDAP_SERVER_URI = "ldap://myldapserver.com"
AUTH_LDAP_CONNECTION_OPTIONS = {ldap.OPT_REFERRALS : 0}
AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s, OU=USERS,dc=myldapserver, dc=com"
AUTH_LDAP_START_TLS = True
#Register authentication backend
AUTHENTICATION_BACKENDS = [
"django_auth_ldap.backend.LDAPBackend",
]在views.py中调用身份验证。
from django_auth_ldap.backend import LDAPBackend
def accounts_login(request):
username = ""
password = ""
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
auth = LDAPBackend()
user = auth.authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect("/")
else:
error = "Authentication Failed"
return render(request, "accounts/login.html", 'error':error)
return render(request, "accounts/login.html")但是,使用上述方法总是无法通过LDAP服务器进行身份验证。
如果我使用普通python ()进行调用,那么身份验证在同一个simple_bind_s服务器上运行良好。
import ldap
def ldap_auth(username, password):
conn = ldap.initialize(myproj.settings.LDAP_AUTH_URI)
try:
ldap.set_option(ldap.OPT_REFERRALS, 0)
#ldap.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
conn.simple_bind_s(username, password)
except ldap.LDAPError as e:
return f'failed to authenticate'
conn.unbind_s()
return "Success"有人能建议我按照我的要求使LDAPBackend认证工作吗?
注意:我没有LDAP服务器的管理权限。
发布于 2020-08-20 17:16:19
这就是我在ldap3和没有django_auth_ldap包的情况下所做的。
1-在AuthenticationBackend中创建自定义your_app/backends.py:
import logging
from ldap3 import Server, Connection
from ldap3.core.exceptions import LDAPBindError
from django.conf import settings
from django.contrib.auth import get_user_model
logger = logging.getLogger(__name__)
UserModel = get_user_model()
class LDAPBackend:
def authenticate(self, request, username=None, password=None, **kwargs):
# set username to lowercase for consistency
username = username.lower()
# get the bind client to resolve DN
logger.info('authenticating %s' % username)
# set your server
server = Server(settings.LDAP_HOST, get_info=ALL)
try:
conn = Connection(server, f"{username}@{settings.LDAP_DOMAIN}", password=password, auto_bind=True)
except LDAPBindError as e:
logger.info('LDAP authentication failed')
logger.info(e)
return None
user = UserModel.objects.update_or_create(username=username)
return user
def get_user(self, user_id):
try:
return UserModel._default_manager.get(pk=user_id)
except UserModel.DoesNotExist:
return None2-在LDAPBackend中将settings.py声明为身份验证后端
AUTHENTICATION_BACKENDS = [
'your_app.backends.LDAPBackend',
'django.contrib.auth.backends.ModelBackend'
]这允许您使用django的本机函数进行身份验证,并且它与admin一起工作。
若要使会话仅工作5分钟,请将此设置添加到settings.py文件中:
SESSION_COOKIE_AGE = 5 * 60让我知道它是否适合你的。
https://stackoverflow.com/questions/62249059
复制相似问题