django with apache ldap backend auth,登录用户名和ldap group&隐藏基于组的详细信息(mod_ldap)

时间:2016-05-10 11:59:51

标签: python django apache

我正在使用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组

由于

2 个答案:

答案 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;

}