自定义Django VM控制面板 - 需要LDAP问题/洞察力

时间:2013-08-23 17:29:03

标签: django python-2.7 ldap

我是夏天的公司实习生。我被分配了一个必须在Django中完成的项目。我有一个粗略的设置,我需要一些反馈,我应该如何进一步设置。 techops团队中的人们花费太多时间为开发人员重新启动虚拟机时会破坏某些东西。解决方案是允许用户自己执行此操作。

项目大纲

  • 用户使用ldap凭据登录
  • 服务器获取个人所在的ldap组['techops','staff']
  • 仅显示位于这些ldap组之外的服务器
  • 用户将可以重启这些虚拟机
  • 服务器将通过SSH密钥ssh进入指定的VM域并触发vm reboot

我目前能够让用户通过ldap登录管理面板,但不能在网站的单独身份验证页面上登录。有没有办法自动填充用户的LDAP组?

# Populate the Django user from the LDAP directory.
AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail"
}

我需要帮助了解LDAP如何工作(使用Django),以及如何检索登录的当前用户,运行我的get_Ldapgroups函数,将这些组与服务器ldap组进行比较,然后仅在/上显示这些服务器重启页面。

请随时提出问题或要求提供任何其他文件。我感谢你们给我的所有时间和帮助。

以下是我的文件:

servers models.py

class Team(models.Model):
  name = models.CharField(max_length=64)
  email = models.EmailField(max_length=254, default='@business.com')
  ldap_group = models.CharField(max_length=64)

  def __unicode__(self):
        return '"' + self.name + '" <' + self.email + '>'

class Site(models.Model):
  name = models.CharField(max_length=254)

  def __unicode__(self):
        return self.name

class Server(models.Model):
  hostname = models.CharField(max_length=254)
  fqdn = models.CharField(max_length=254)
  owner = models.ForeignKey(Team)
  site = models.ForeignKey(Site)

  def __unicode__(self):
        return self.hostname

重启views.py 列出服务器,当你点击服务器时,它让你知道它是否“活着”

from django.template import Context, loader
from django.http import HttpResponse
from servers.models import Server
import paramiko
import socket

def index(request):
  t = loader.get_template('reboot/index.html')
  servers = Server.objects.all()
  c = Context( {
    'servers': servers,
  })
  return HttpResponse(t.render(c))

def test_ssh_liveness(ssh, name):
  try:
    ssh.connect(name, timeout='1')
    return True
  except socket.timeout:
    # server is down
    return False
  except socket.gaierror:
    # invalid server name
    return False
  except paramiko.SSHException:
    # unknown host key
    return True

def server(request, name):
  ssh = paramiko.SSHClient()
  is_alive = test_ssh_liveness(ssh, name)
  return HttpResponse("You selected server "+name+" and it is "+str(is_alive))

重启模板

{% block title %}Server{% endblock %}

{% block content %}
<h1>Server</h1>
<ul>
  {% for server in servers %}
    <li><a href="{% url 'server' server.hostname %}">{{ server.hostname }}
  {% endfor %}
</ul>
{% endblock %}

1 个答案:

答案 0 :(得分:1)

django有一个可插拔的身份验证系统,具有不同后端的概念。 django带有两个后端;一个使用数据库,另一个可以使用外部用户系统。

利用这种灵活性的是django-auth-ldap,这是一个设计用于LDAP目录的自定义后端。它是替代品。

您进行了设置,然后它会自动填充用户组,也可以执行其他操作(有关详细信息,请参阅documentation)。

example configuration详细介绍了大部分配置和设置细节。

作为最后一个提示,考虑卸载重启服务器。否则,如果出现网络问题或其他延迟,您的应用程序将无法阻止。要从django离线安排任务,请使用celery