fix acl api

This commit is contained in:
pycook 2019-11-18 12:02:02 +08:00
parent f78c3b928b
commit 0a13186c13
6 changed files with 56 additions and 5 deletions

View File

@ -1 +1,23 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from functools import wraps
from flask import request
from flask import abort
from api.lib.perm.acl.cache import AppCache
def validate_app(func):
@wraps(func)
def wrapper(*args, **kwargs):
app_id = request.values.get('app_id')
app = AppCache.get(app_id)
if app is None:
return abort(400, "App <{0}> does not exist".format(app_id))
request.values['app_id'] = app.id
return func(*args, **kwargs)
return wrapper

View File

@ -1,11 +1,37 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from api.extensions import cache from api.extensions import cache
from api.models.acl import App
from api.models.acl import Permission from api.models.acl import Permission
from api.models.acl import Role from api.models.acl import Role
from api.models.acl import User from api.models.acl import User
class AppCache(object):
PREFIX_ID = "App::id::{0}"
PREFIX_NAME = "App::name::{0}"
@classmethod
def get(cls, key):
app = cache.get(cls.PREFIX_ID.format(key)) or cache.get(cls.PREFIX_NAME.format(key))
if app is None:
app = App.get_by_id(key) or App.get_by(name=key, to_dict=False, first=True)
if app is not None:
cls.set(app)
return app
@classmethod
def set(cls, app):
cache.set(cls.PREFIX_ID.format(app.id), app)
cache.set(cls.PREFIX_NAME.format(app.name), app)
@classmethod
def clean(cls, app):
cache.delete(cls.PREFIX_ID.format(app.id))
cache.delete(cls.PREFIX_NAME.format(app.name))
class UserCache(object): class UserCache(object):
PREFIX_ID = "User::uid::{0}" PREFIX_ID = "User::uid::{0}"
PREFIX_NAME = "User::username::{0}" PREFIX_NAME = "User::username::{0}"

View File

@ -156,6 +156,3 @@ class ResourceCRUD(object):
resource = Resource.get_by_id(_id) or abort(404, "Resource <{0}> is not found".format(_id)) resource = Resource.get_by_id(_id) or abort(404, "Resource <{0}> is not found".format(_id))
resource.soft_delete() resource.soft_delete()

View File

@ -1,3 +1 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
__author__ = 'pycook'

View File

@ -3,6 +3,7 @@
from flask import request from flask import request
from api.lib.decorator import args_required from api.lib.decorator import args_required
from api.lib.perm.acl import validate_app
from api.lib.perm.acl.resource import ResourceCRUD from api.lib.perm.acl.resource import ResourceCRUD
from api.lib.perm.acl.resource import ResourceGroupCRUD from api.lib.perm.acl.resource import ResourceGroupCRUD
from api.lib.utils import get_page from api.lib.utils import get_page
@ -15,6 +16,7 @@ class ResourceView(APIView):
url_prefix = ("/resources", "/resources/<int:resource_id>") url_prefix = ("/resources", "/resources/<int:resource_id>")
@args_required('app_id') @args_required('app_id')
@validate_app
def get(self): def get(self):
page = get_page(request.values.get("page", 1)) page = get_page(request.values.get("page", 1))
page_size = get_page_size(request.values.get("page_size")) page_size = get_page_size(request.values.get("page_size"))
@ -31,6 +33,7 @@ class ResourceView(APIView):
@args_required('name') @args_required('name')
@args_required('type_id') @args_required('type_id')
@args_required('app_id') @args_required('app_id')
@validate_app
def post(self): def post(self):
name = request.values.get('name') name = request.values.get('name')
type_id = request.values.get('type_id') type_id = request.values.get('type_id')
@ -57,6 +60,7 @@ class ResourceView(APIView):
class ResourceGroupView(APIView): class ResourceGroupView(APIView):
url_prefix = ("/resource_groups", "/resource_groups/<int:group_id>") url_prefix = ("/resource_groups", "/resource_groups/<int:group_id>")
@validate_app
def get(self): def get(self):
page = get_page(request.values.get("page", 1)) page = get_page(request.values.get("page", 1))
page_size = get_page_size(request.values.get("page_size")) page_size = get_page_size(request.values.get("page_size"))
@ -73,6 +77,7 @@ class ResourceGroupView(APIView):
@args_required('name') @args_required('name')
@args_required('type_id') @args_required('type_id')
@args_required('app_id') @args_required('app_id')
@validate_app
def post(self): def post(self):
name = request.values.get('name') name = request.values.get('name')
type_id = request.values.get('type_id') type_id = request.values.get('type_id')

View File

@ -3,6 +3,7 @@
from flask import request from flask import request
from api.lib.decorator import args_required from api.lib.decorator import args_required
from api.lib.perm.acl import validate_app
from api.lib.perm.acl.role import RoleCRUD from api.lib.perm.acl.role import RoleCRUD
from api.lib.perm.acl.role import RoleRelationCRUD from api.lib.perm.acl.role import RoleRelationCRUD
from api.lib.utils import get_page from api.lib.utils import get_page
@ -14,6 +15,7 @@ class RoleView(APIView):
url_prefix = ("/roles", "/roles/<int:rid>") url_prefix = ("/roles", "/roles/<int:rid>")
@args_required('app_id') @args_required('app_id')
@validate_app
def get(self): def get(self):
page = get_page(request.values.get("page", 1)) page = get_page(request.values.get("page", 1))
page_size = get_page_size(request.values.get("page_size")) page_size = get_page_size(request.values.get("page_size"))
@ -32,6 +34,7 @@ class RoleView(APIView):
@args_required('name') @args_required('name')
@args_required('app_id') @args_required('app_id')
@validate_app
def post(self): def post(self):
name = request.values.get('name') name = request.values.get('name')
app_id = request.values.get('app_id') app_id = request.values.get('app_id')