Require login across entire site

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
###
# Copyright (c) 2006-2007, Jared Kuolt
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without 
# modification, are permitted provided that the following conditions are met:
# 
#     * Redistributions of source code must retain the above copyright notice, 
#       this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright 
#       notice, this list of conditions and the following disclaimer in the 
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of the SuperJared.com nor the names of its 
#       contributors may be used to endorse or promote products derived from 
#       this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
# POSSIBILITY OF SUCH DAMAGE.
###

from django.conf import settings
from django.contrib.auth.views import login
from django.http import HttpResponseRedirect

class RequireLoginMiddleware(object):
    """
    Require Login middleware. If enabled, each Django-powered page will
    require authentication.
    
    If an anonymous user requests a page, he/she is redirected to the login
    page set by REQUIRE_LOGIN_PATH or /accounts/login/ by default.
    """
    def __init__(self):
        self.require_login_path = getattr(settings, 'REQUIRE_LOGIN_PATH', '/accounts/login/')
    
    def process_request(self, request):
        if request.path != self.require_login_path and request.user.is_anonymous():
            if request.POST:
                return login(request)
            else:
                return HttpResponseRedirect('%s?next=%s' % (self.require_login_path, request.path))
                

More like this

  1. Login Required Middleware with Next Parameter by bernardoporto 1 year, 5 months ago
  2. Login Required Middleware by onecreativenerd 5 years, 5 months ago
  3. Require Login Middleware by mattgrayson 5 years, 5 months ago
  4. Enforce site wide login by chbrown 5 years, 6 months ago
  5. Judge login require by url by zuroc 6 years, 8 months ago

Comments

aeby (on April 27, 2007):

Thanks for this snippet!

Perhaps it would be useful to exclude request.path starting with MEDIA_ROOT.

Quick hack:

def process_request(self, request):
    if request.path.startswith(settings.MEDIA_ROOT):
       return None
...

#

skam (on April 29, 2007):

I don't want to have hardcoded urls in my settings file

from django.core.urlresolvers import resolve

def __init__(self):
    self.require_login_path = resolve(login)

#

skam (on May 20, 2007):

sorry for my comment, it doesn't work

#

ffualo (on April 8, 2009):

What a stupid copyright. This snippet is just using Django's predefined dots.

#

shwetabhsharan@gmail.com (on May 15, 2012):

I used the above snippet for enforcing site wide login required. I am facing an issue here. I successfully login into the system and get redirected to /app/home/ page. I navigate to /app/profile/ and clear the cache, not when I click some links, I get redirected to the login page but when I login, it doesn't redirect to /app/profile/. Instead it goes to /app/home/. Please let me know how can I achieve this.

#

(Forgotten your password?)