Inside auth backend++ WIP

This commit is contained in:
nikolark committed 2015-01-02 22:48:54 +01:00
1 parent 0f44addfaa
commit 33d85eaa19
4 files changed
+88 -6

No files matched your search

+5
View File
@@ -19,3 +19,8 @@
- Kerberos: TODO
- RADIUS: TODO
- Inside: Going away
# TODO
- finish auth backend.
- allow non LDAP-users (conditional LDAP-stuff), because we don't want LDAP filled with non-active members
+76
View File
@@ -0,0 +1,76 @@
from django.contrib.auth.models import User, Group
from django.db import connections
class InsideBackend(object):
"""
Authenticate against the inside database
"""
def authenticate(self, username=None, password=None):
row = None
cur = connections['inside'].cursor()
try:
cur.execute("SELECT id,firstname,lastname,email FROM din_user WHERE password=PASSWORD(%s) AND (username=%s OR email=%s)", [password, username, username])
row = cur.fetchone()
except Exception as e:
# FIXME errorhandling
print "Auth ERROR: {}".format(e)
raise e
finally:
cur.close()
if row:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# Create a new user.
user = User(username=username, password=password)
user = self._update_user_details(user, row) # Saves user object
user = self._update_groups(user, row)
return user
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
def _update_user_details(self, user, row):
uid, first_name, last_name, email = row
user.first_name = first_name
user.last_name = last_name
user.email = email
user.save()
return user
def _update_groups(self, user, user_row):
groups = None
cur = connections['inside'].cursor()
user_id = user_row[0]
existing_groups = list(user.groups.all())
try:
cur.execute("SELECT g.posix_group FROM din_user AS u LEFT JOIN din_usergrouprelationship AS ugr ON u.id = ugr.user_id LEFT JOIN din_group AS g ON ugr.group_id = g.id WHERE u.id = %s AND g.posix_group != ''", (int(user_row[0]),))
groups = map(lambda x: x[0], cur.fetchall())
for group in groups:
g, created = Group.objects.get_or_create(name=group)
user.groups.add(g)
# Remove old relationships
# TODO: if setting is set, not tested
for g in existing_groups:
if g.name not in groups:
user.groups.remove(g)
except Exception as e:
# FIXME errorhandling
print "ERROR: {}".format(e)
finally:
cur.close()
return user
+3 -2
View File
@@ -38,14 +38,15 @@ def index(request):
@login_required
def profile(request):
username = request.user.username
groups = request.user.groups.all()
ldap_user = None
try:
ldap_user = LdapUser.objects.get(username=username)
except:
return render_to_response('private/profile.html', locals(), context_instance=RequestContext(request))
groups = LdapGroup.objects.filter(usernames__contains=username)
private_group = LdapGroup.objects.get(gid=ldap_user.group)
ldap_groups = LdapGroup.objects.filter(usernames__contains=username)
ldap_private_group = LdapGroup.objects.get(gid=ldap_user.group)
return render_to_response('private/profile.html', locals(), context_instance=RequestContext(request))
+4 -4
View File
@@ -8,9 +8,9 @@
<h2>Om deg</h2>
<div class="well">
<ul>
<li><strong>Brukernavn</strong>: {{ldap_user.username}}</li>
<li><strong>Navn</strong>: {{ldap_user.full_name}}</li>
<li><strong>Mail</strong>: {{ldap_user.email}}</li>
<li><strong>Brukernavn</strong>: {{user.username}}</li>
<li><strong>Navn</strong>: {{user.first_name}} {{user.last_name}}</li>
<li><strong>Mail</strong>: {{user.email}}</li>
</ul>
</div>
</section>
@@ -28,7 +28,7 @@
<div class="well">
<ul>
{% if groups %}
<li>{{ private_group }}</li>
{% if ldap_private_group %}<li>{{ ldap_private_group }}</li>{% endif %}
{% for group in groups %}
{% if group = "dns-aktiv" %}
<li title="Du har tilgang til foreningsmaskinene.">{{ group }}</li>