我正在使用Django和Apache和LDAP后端身份验证,我的http conf如下:
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#
<Location />
AuthName "Please enter your domain credentials."
AuthBasicProvider ldap
AuthType basic
AuthLDAPUrl "ldap://example.com:389/DC=example,DC=com?sAMAccountName"
AuthLDAPBindDN "CN=serv,OU=Service Accounts,DC=example,DC=com"
AuthLDAPBindPassword XXXX
AuthLDAPBindAuthoritative off
LDAPReferrals off
Require valid-user
</Location>
当我现在加载我的网站时,我得到一个基本的身份验证提示,这很棒,现在能够做的就是接收登录的用户名,我搜索过并尝试了一些事情,例如:
LoggedInUser = request.user.username
给我一个请求是没有定义的消息(我在顶部有导入请求)
LoggedInUser = os.getenv["REMOTE_USER"]
给了我TypeError:'function'对象没有属性' getitem '
有谁知道我需要使用什么?
我还需要隐藏用户的某些网址,如果他们不在正确的ldap组中,那么还需要从会话中获取用户AD组
由于
答案 0 :(得分:3)
每个请求在Django request.META
对象中找到WSGI环境键/值。因此,试试:
request.META['REMOTE_USER']
Apache是否以您希望的格式传递给您的是另一个问题。您可以在传递的其他变量中找到所需内容。参见:
答案 1 :(得分:1)
根据文档主题"Authentication using REMOTE_USER",为了使用Apache身份验证,您必须包含特定的中间件:
配置
首先,您必须在
MIDDLEWARE_CLASSES
之后将django.contrib.auth.middleware.AuthenticationMiddleware
添加到MIDDLEWARE_CLASSES = [ '...', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.RemoteUserMiddleware', '...', ]
设置:
ModelBackend
接下来,您必须将
RemoteUserBackend
替换为AUTHENTICATION_BACKENDS
设置中的AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.RemoteUserBackend', ]
:
request.user
如果你已经做到这一点没有成功,并且考虑到你需要更细粒度的访问控制,我只需编写一个自定义身份验证后端并完全抛弃mod_ldap。 Writing a custom authentication backend is really easy。关键是在编写后端之前让python ldap模块工作。
要访问def index(request):
user = request.user
return render(request, 'template.html', {"user": user})
,您必须位于Django视图中。例如:
template.html
在<h1>Hi, {{ user }}</h1>
文件中:
public function index()
{
$secSubs = Student::find(1);
return $secSubs->sectionSubjects;
}