@@ -27,6 +27,7 @@ def __init__(self, app, adapter, watcher=None):
2727 self .e = casbin .Enforcer (app .config .get ("CASBIN_MODEL" ), self .adapter , True )
2828 if watcher :
2929 self .e .set_watcher (watcher )
30+ self ._owner_loader = None
3031
3132 def set_watcher (self , watcher ):
3233 """
@@ -38,6 +39,17 @@ def set_watcher(self, watcher):
3839 """
3940 self .e .set_watcher (watcher )
4041
42+ def owner_loader (self , callback ):
43+ """
44+ This sets the callback for get owner. The
45+ function return a owner object, or ``None``
46+
47+ :param callback: The callback for retrieving a owner object.
48+ :type callback: callable
49+ """
50+ self ._owner_loader = callback
51+ return callback
52+
4153 def enforcer (self , func ):
4254 @wraps (func )
4355 def wrapper (* args , ** kwargs ):
@@ -50,6 +62,14 @@ def wrapper(*args, **kwargs):
5062 )
5163 # Set resource URI from request
5264 uri = str (request .path )
65+ # Get owner from owner_loader
66+ if self ._owner_loader :
67+ self .app .logger .info ("Get owner from owner_loader" )
68+ for owner in self ._owner_loader ():
69+ if self .e .enforce (
70+ owner .strip ('"' ), uri , request .method
71+ ):
72+ return func (* args , ** kwargs )
5373 for header in self .app .config .get ("CASBIN_OWNER_HEADERS" ):
5474 if header in request .headers :
5575 # Make Authorization Header Parser standard
0 commit comments