1
1
# coding: utf-8
2
2
from django .contrib .auth .backends import ModelBackend
3
+ from django .contrib .auth .models import AnonymousUser
3
4
from django .conf import settings
4
5
5
- from kpi .utils .object_permission import get_database_user
6
- from .utils .permissions import is_user_anonymous
6
+ from .models .object_permission import get_anonymous_user , perm_parse
7
7
8
8
9
9
class ObjectPermissionBackend (ModelBackend ):
10
+ @staticmethod
11
+ def _translate_anonymous_user (user_obj ):
12
+ """
13
+ Returns user_obj, is_anonymous, where user_obj is always a real
14
+ User object (translated from AnonymousUser if necessary), and
15
+ is_anonymous is True if the user is anonymous
16
+ """
17
+ is_anonymous = False
18
+ if isinstance (user_obj , AnonymousUser ):
19
+ is_anonymous = True
20
+ user_obj = get_anonymous_user ()
21
+ elif user_obj .pk == settings .ANONYMOUS_USER_ID :
22
+ is_anonymous = True
23
+ return user_obj , is_anonymous
24
+
10
25
def get_group_permissions (self , user_obj , obj = None ):
11
- is_anonymous = is_user_anonymous (user_obj )
12
- user_obj = get_database_user (user_obj )
26
+ user_obj , is_anonymous = self ._translate_anonymous_user (user_obj )
13
27
permissions = super ().get_group_permissions (user_obj , obj )
14
28
if is_anonymous :
15
29
# Obey limits on anonymous users' permissions
@@ -19,8 +33,7 @@ def get_group_permissions(self, user_obj, obj=None):
19
33
return permissions
20
34
21
35
def get_all_permissions (self , user_obj , obj = None ):
22
- is_anonymous = is_user_anonymous (user_obj )
23
- user_obj = get_database_user (user_obj )
36
+ user_obj , is_anonymous = self ._translate_anonymous_user (user_obj )
24
37
permissions = super ().get_all_permissions (user_obj , obj )
25
38
if is_anonymous :
26
39
# Obey limits on anonymous users' permissions
@@ -30,8 +43,7 @@ def get_all_permissions(self, user_obj, obj=None):
30
43
return permissions
31
44
32
45
def has_perm (self , user_obj , perm , obj = None ):
33
- is_anonymous = is_user_anonymous (user_obj )
34
- user_obj = get_database_user (user_obj )
46
+ user_obj , is_anonymous = self ._translate_anonymous_user (user_obj )
35
47
if obj is None or not hasattr (obj , 'has_perm' ):
36
48
if is_anonymous :
37
49
# Obey limits on anonymous users' permissions
@@ -43,4 +55,3 @@ def has_perm(self, user_obj, perm, obj=None):
43
55
return False
44
56
# Trust the object-level test to handle anonymous users correctly
45
57
return obj .has_perm (user_obj , perm )
46
-
0 commit comments