blob: 552a6bf3265346c5f53d013da25c1e8c3474915a [file] [log] [blame]
mblighe8819cd2008-02-15 16:48:40 +00001from django.contrib.auth.models import User, Group, check_password
2from django.contrib import auth
3from django import http
4
5from frontend.afe import models, management
6
7DEBUG_USER = 'debug_user'
8
9class SimpleAuthBackend:
10 """
11 Automatically allows any login. This backend is for use when Apache is
12 doing the real authentication. Also ensures logged-in user exists in
13 frontend.afe.models.User database.
14 """
15 def authenticate(self, username=None, password=None):
16 try:
17 user = User.objects.get(username=username)
18 except User.DoesNotExist:
19 # password is meaningless
20 user = User(username=username,
21 password='apache authentication')
22 user.is_staff = True
23 user.save() # need to save before adding groups
24 user.groups.add(Group.objects.get(
25 name=management.BASIC_ADMIN))
26
27 SimpleAuthBackend.check_afe_user(username)
28 return user
29
30
31 @staticmethod
32 def check_afe_user(username):
33 user, _ = models.User.objects.get_or_create(login=username)
34 user.save()
35
36 def get_user(self, user_id):
37 try:
38 return User.objects.get(pk=user_id)
39 except User.DoesNotExist:
40 return None
41
42
43class ApacheAuthMiddleware(object):
44 """
45 Middleware for use when Apache is doing authentication. Looks for
46 REQUEST_USER in requests and logs that user in. If no such header is
47 found, looks for HTTP_AUTHORIZATION header with username to login (this
48 allows CLI to authenticate).
49 """
50
51 def process_request(self, request):
52 # look for a username from Apache
53 user = request.META.get('REMOTE_USER')
54 if user is None:
55 # look for a user in headers. This is insecure but
56 # it's our temporarily solution for CLI auth.
57 user = request.META.get('HTTP_AUTHORIZATION')
58 if user is None:
59 # no user info - assume we're in development mode
60 user = DEBUG_USER
61 user_object = auth.authenticate(username=user,
62 password='')
63 auth.login(request, user_object)
64 request.afe_user = models.User.objects.get(login=user)
65 return None