= CookBook - IP Access Middleware = == The idea == The idea of this recipe is to provide automatic user authentication based on specified IP addresses for some client computers. == IPAccess Model == You must define a model that allows defining tuples of type (IP addr, user): IP of the client computer with the web browser, user to be authenticated. This is the proposed model (suppose ''myproj/myapp/models.py''): {{{ from django.contrib.auth.models import User class IPAccess(models.Model): ip = models.IPAddressField(unique=True, db_index=True) user = models.ForeignKey(User, verbose_name='user that authenticates') def __str__(self): return self.ip class Meta: verbose_name = 'IP Access' verbose_name_plural = 'IP Accesses' class Admin: list_display = ('ip', 'user') }}} == IPAccess Middleware == The mission of this middleware is to authenticate automatically with an user defined in models, '''only if''' the browser's remote IP address exists in the ''IPAccess'' table. This is the code (in file ''myproj/myapp/middleware.py''): {{{ from django.contrib.auth.models import AnonymousUser from myproj.myapp.models import IPAccess class IPAccessMiddleware(object): def process_request(self, request): if request.user == AnonymousUser(): remoteip = request.META['REMOTE_ADDR'] try: ipaccess = IPAccess.objects.get(ip=remoteip) request.user = ipaccess.user except IPAccess.DoesNotExist: pass return None }}} == Settings == For the middleware to work, you have to insert a line with ''IPAccessMiddleware'' into ''MIDDLEWARE_CLASSES'' of the settings.py file. Obviously, it also requires the installation of ''!AuthenticationMiddleware''. The code should be something like this: {{{ MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.doc.XViewMiddleware', 'yourproject.apps.news.middleware.IPAccessMiddleware', ) }}} == A Complete Application == I have also developed [attachment:ipaccess.tgz an application] which offers this functionality. To install it, just untar the files in this archive and put it in ''apps'' directory in your project, then ''change'' the import statements and add a two lines to the settings.py file: {{{ INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.comments', 'django.contrib.admin', 'yourproject.apps.yourapp', 'yourproject.apps.ipaccess', ) }}} Have fun.