Add decorator for role protection
parent
562e2653c9
commit
bea29b4e42
|
@ -33,6 +33,22 @@ def protected(func):
|
||||||
return protected_function
|
return protected_function
|
||||||
|
|
||||||
|
|
||||||
|
def requires_permission(permission, action_name='Action'):
|
||||||
|
def requires_permission_decorator(func):
|
||||||
|
@wraps(func)
|
||||||
|
def permission_protected_function(*args, **kwargs):
|
||||||
|
if permission not in g.current_account.role.permissions:
|
||||||
|
abort(403,
|
||||||
|
message=(action_name+' is not allowed'),
|
||||||
|
status='error')
|
||||||
|
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
|
||||||
|
return permission_protected_function
|
||||||
|
|
||||||
|
return requires_permission_decorator
|
||||||
|
|
||||||
|
|
||||||
class ProtectedResource(Resource):
|
class ProtectedResource(Resource):
|
||||||
method_decorators = [protected]
|
method_decorators = [protected]
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ from marshmallow import Schema, fields
|
||||||
from webargs.flaskparser import use_args
|
from webargs.flaskparser import use_args
|
||||||
from flasgger import swag_from
|
from flasgger import swag_from
|
||||||
import app.accounts as accounts
|
import app.accounts as accounts
|
||||||
from app.api import ProtectedResource
|
from app.api import ProtectedResource, requires_permission
|
||||||
|
|
||||||
|
|
||||||
class UserSchema(Schema):
|
class UserSchema(Schema):
|
||||||
|
@ -65,6 +65,7 @@ class RoleResource(ProtectedResource):
|
||||||
class RolesResource(ProtectedResource):
|
class RolesResource(ProtectedResource):
|
||||||
@use_args(RoleCreationWrapperSchema())
|
@use_args(RoleCreationWrapperSchema())
|
||||||
@swag_from('swagger/create_role_spec.yaml')
|
@swag_from('swagger/create_role_spec.yaml')
|
||||||
|
@requires_permission('CREATE_ROLE', 'Role creation')
|
||||||
def post(self, args):
|
def post(self, args):
|
||||||
args = args['role']
|
args = args['role']
|
||||||
success = accounts.create_role(args['display_name'],
|
success = accounts.create_role(args['display_name'],
|
||||||
|
|
Loading…
Reference in New Issue