Skip to content

Instantly share code, notes, and snippets.

@carc1n0gen
Last active December 7, 2020 21:03
Show Gist options
  • Save carc1n0gen/86f0cfd34a6260f22f40925b599a0cd6 to your computer and use it in GitHub Desktop.
Save carc1n0gen/86f0cfd34a6260f22f40925b599a0cd6 to your computer and use it in GitHub Desktop.
GateNotDefined = type('GateNotDefined', (Exception,), {})
class Gatekeeper:
def __init__(self, gates={}, before=None):
self.gates = gates
self.before = before
def define(self, name, fn):
self.gates[name] = fn
def allows(self, name, user, entity):
if self.before and self.before(user):
return True
gate = self.gates.get(name)
if not gate:
raise GateNotDefined('No gate named {} is defined.'.format(name))
return gate(user, entity)
def denies(self, name, user, entity):
return not self.allows(name, user, entity)
# Define permissions
gate = Gatekeeper(before=lambda user: user.is_admin)
gate.define('post.update', lambda user, post: user.id == post.user_id)
gate.define('post.delete', lambda user, post: user.id == post.user_id)
# Check permissions
if gate.denies('post.update', current_user, post):
# not allowed
else:
# allowed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment