diff --git a/auth.py b/auth.py
index e48e651e301e1182345babaf34d7e8f046fcfd3a..899509dff69c5a9387fba405d4944f7c444da6be 100644
--- a/auth.py
+++ b/auth.py
@@ -3,6 +3,7 @@ import ssl
 import ldap3
 from ldap3.utils.dn import parse_dn
 from datetime import datetime
+import grp, pwd, pam
 
 class User:
     def __init__(self, username, groups, timestamp=None, obsolete=False, permanent=False):
@@ -137,7 +138,7 @@ class ADManager:
 
 
 class StaticUserManager:
-    def __init__(self, users):
+    def __init__(self, users, obsolete=False):
         self.passwords = {
             username: password
             for (username, password, groups) in users
@@ -146,6 +147,7 @@ class StaticUserManager:
             username: groups
             for (username, password, groups) in users
         }
+        self.obsolete = obsolete
 
     def authenticate(self, username, password):
         return (username in self.passwords
@@ -156,8 +158,27 @@ class StaticUserManager:
             yield from self.groups[username]
 
     def all_groups(self):
-        return list(set(group for group in groups.values()))
+        yield from list(set(group for group in groups.values()))
+
 
+class PAMManager:
+    def __init__(self, obsolete=False):
+        self.pam = pam.pam()
+        self.obsolete = obsolete
+
+    def authenticate(self, username, password):
+        return self.pam.authenticate(username, password)
+
+    def groups(self, username, password=None):
+        print(username)
+        yield grp.getgrgid(pwd.getpwnam(username).pw_gid).gr_name
+        for group in grp.getgrall():
+            if username in group.gr_mem:
+                yield group.gr_name
+
+    def all_groups(self):
+        for group in grp.getgrall():
+            yield group.gr_name
 
 class SecurityManager:
     def __init__(self, key, max_duration=300):