Para tal, criarei uma classe para gerenciar IPs permitidos via administrativo. Crie uma nova app no seu projeto e dê o nome de permissoes.
Deixe os arquivos como a seguir:
models.py
# coding: utf-8 from django.db import models # Create your models here. class IP(models.Model): """(IP description)""" ip = models.GenericIPAddressField() descricao = models.CharField(max_length=255, null=True, blank=True,verbose_name=u'Descrição') data = models.DateTimeField(auto_now=True) class Meta: verbose_name, verbose_name_plural = u"IP" , u"IPs" ordering = ('-data',) def __unicode__(self): return u"%s" % self.ip
admin.py
# coding: utf-8 from django.contrib import admin from .models import * class IPAdmin(admin.ModelAdmin): search_fields = ('ip', 'descricao',) list_display = ('ip', 'descricao','data',) list_filter = ['data',] save_on_top = True admin.site.register(IP, IPAdmin)
Adicione sua app no INSTALLED_APPS:
... 'permissoes', ...
E por fim, não menos importante, o middleware. Crie um arquivo chamado middleware.py e coloque no mesmo diretorio do settings.py com o conteúdo abaixo:
# coding: utf-8 from django.conf import settings from django.http import HttpResponseRedirect from permissoes.models import IP class NeedToLoginMiddleware(object): def process_request(self, request): # pega o IP do usuário ip = request.META['REMOTE_ADDR'] # verifica se o ip consta na base de ips permitidos ip_permitido = IP.objects.filter(ip=ip).count() # lista de urls que não serão validadas ALLOWED_URLS = [ '%s' % settings.LOGIN_URL, '/admin/', ] for a in ALLOWED_URLS: try: if request.META['PATH_INFO'].find(a) >= 0: return None except: pass # verifica se o ip está permitido if ip_permitido: return None else: # se o ip não estiver permitido, verifica se o usuário está autenticado # e redireciona para url de login em caso negativo. if not request.user.is_authenticated(): #if ip check failed, make authentication check return HttpResponseRedirect(settings.LOGIN_URL) return None
Adicone ele na sua setting MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = ( ... 'app.middleware.NeedToLoginMiddleware', )
hasta!
Nenhum comentário:
Postar um comentário