From 3f751508bccc1cd13ed49a98b5d8a5a032c75c66 Mon Sep 17 00:00:00 2001 From: Chunlin Zhang Date: Fri, 14 Dec 2018 15:28:03 +0800 Subject: [PATCH 1/4] refractor apijson models settings, add apijson style roles --- demo/apps/apijson_demo/dbinit.py | 8 ++++ demo/apps/apijson_demo/views.py | 6 +-- demo/apps/settings.ini | 12 ++---- uliweb_apijson/apijson/settings.ini | 15 +++++-- uliweb_apijson/apijson/views.py | 64 +++++++++++++++++++++-------- 5 files changed, 73 insertions(+), 32 deletions(-) diff --git a/demo/apps/apijson_demo/dbinit.py b/demo/apps/apijson_demo/dbinit.py index bb34631..b235176 100644 --- a/demo/apps/apijson_demo/dbinit.py +++ b/demo/apps/apijson_demo/dbinit.py @@ -10,6 +10,11 @@ Moment = models.moment user_list = [ + { + "username": "admin", + "nickname": "Administrator", + "email": "admin@localhost", + }, { "username": "usera", "nickname": "User A", @@ -101,7 +106,10 @@ print("create user '%s'"%(d["username"])) u = User(**d) u.set_password("123") + if d["username"]=="admin": + u.is_superuser = True u.save() + for d in privacy_list: user = User.get(User.c.username==d["username"]) if user: diff --git a/demo/apps/apijson_demo/views.py b/demo/apps/apijson_demo/views.py index af9807b..8b03568 100644 --- a/demo/apps/apijson_demo/views.py +++ b/demo/apps/apijson_demo/views.py @@ -5,9 +5,9 @@ @expose('/') def index(): if request.user: - user_info = "login as user '%s'"%(request.user) + user_info = "login as user '%s(%s)'"%(request.user.username,request.user) else: - user_info = "not login, you can login with username 'usera/userb/userc', and password '123'" + user_info = "not login, you can login with username 'admin/usera/userb/userc', and password '123'" request_get = [ { "label":"Single record query: with id as parameter", @@ -33,7 +33,7 @@ def index(): }''', }, { - "label":"Array query", + "label":"Array query: private data", "value":'''{ "[]":{ "@count":2, diff --git a/demo/apps/settings.ini b/demo/apps/settings.ini index 72f041b..0794738 100644 --- a/demo/apps/settings.ini +++ b/demo/apps/settings.ini @@ -13,6 +13,7 @@ INSTALLED_APPS = [ 'uliweb.contrib.auth', 'uliweb.contrib.i18n', 'uliweb.contrib.flashmessage', + 'uliweb.contrib.rbac', 'uliweb_apps.site', 'uliweb_apps.login', 'uliweb_comui', @@ -27,14 +28,9 @@ MAINMENU = { ] } -[APIJSON_MODEL] -#overwrite user table to public for test -user = { - "user_id_field" : "id", - "secret_fields" : ["password"], - "default_filter_by_self" : True -} - [LAYOUT] logo_lg = "Uliweb" logo_mini = "U" + +[SESSION] +timeout = 36000 diff --git a/uliweb_apijson/apijson/settings.ini b/uliweb_apijson/apijson/settings.ini index bdd90bf..8cf9018 100644 --- a/uliweb_apijson/apijson/settings.ini +++ b/uliweb_apijson/apijson/settings.ini @@ -1,7 +1,16 @@ -[APIJSON_MODEL_CONFIG] +#apijson style role names +[ROLES] +ADMIN = _('APIJSON ADMIN'), 'uliweb.contrib.rbac.superuser', True +UNKNOWN = _('APIJSON UNKNOWN'), 'uliweb.contrib.rbac.anonymous', True +LOGIN = _('APIJSON LOGIN'), 'uliweb.contrib.rbac.trusted', True +#will do more when query in the database +OWNER = _('APIJSON OWNER'), 'uliweb.contrib.rbac.trusted', True + +[APIJSON_MODELS] user = { - "public" : False, "user_id_field" : "id", "secret_fields" : ["password"], - "default_filter_by_self" : True + "rbac_get" : { + "roles" : ["ADMIN","OWNER"] + } } diff --git a/uliweb_apijson/apijson/views.py b/uliweb_apijson/apijson/views.py index 548e85d..dd80d60 100644 --- a/uliweb_apijson/apijson/views.py +++ b/uliweb_apijson/apijson/views.py @@ -25,31 +25,64 @@ def get(self): if key[-2:]=="[]": rsp = self._query_array(key) else: - rsp = self._query_one(key) + rsp = self._get_one(key) if rsp: return rsp return json(self.rdict) - def _query_one(self,key): + def _get_one(self,key): modelname = key + params = self.request_data[key] + try: model = getattr(models,modelname) - model_setting = settings.APIJSON_MODEL.get(modelname,{}) + model_setting = settings.APIJSON_MODELS.get(modelname,{}) except ModelNotFound as e: log.error("try to find model '%s' but not found: '%s'"%(modelname,e)) return json({"code":400,"msg":"model '%s' not found"%(modelname)}) model_column_set = None q = model.all() - public = model_setting.get("public",False) + rbac_get = model_setting.get("rbac_get",{}) + if not rbac_get: + return json({"code":401,"msg":"'%s' not accessible by apijson"%(modelname)}) + + roles = rbac_get.get("roles") + perms = rbac_get.get("perms") + params_role = params.get("@role") + permission_check_ok = False + user_role = None + if params_role: + if params_role not in roles: + return json({"code":401,"msg":"'%s' not accessible by role '%s'"%(modelname,params_role)}) + if functions.has_role(request.user,params_role): + permission_check_ok = True + user_role = params_role + else: + return json({"code":401,"msg":"user doesn't have role '%s'"%(params_role)}) + if not permission_check_ok and roles: + for role in roles: + if functions.has_role(request.user,role): + permission_check_ok = True + user_role = role + break + + if not permission_check_ok and perms: + for perm in perms: + if functions.has_permission(request.user,perm): + permission_check_ok = True + break + + if not permission_check_ok: + return json({"code":401,"msg":"no permission"}) + filtered = False - if not public: - if not request.user: - return json({"code":401,"msg":"'%s' not accessable for unauthorized request"%(modelname)}) + + if user_role == "OWNER": owner_filtered,q = self._filter_owner(model,model_setting,q) - if owner_filtered: - filtered = True - else: - return json({"code":401,"msg":"'%s' not accessable because not public"%(modelname)}) + if not owner_filtered: + return json({"code":401,"msg":"'%s' cannot filter with owner"%(modelname)}) + filtered = True + params = self.request_data[key] if isinstance(params,dict): for n in params: @@ -61,14 +94,9 @@ def _query_one(self,key): filtered = True else: return json({"code":400,"msg":"'%s' have no attribute '%s'"%(modelname,n)}) - #default filter + #default filter is trying to filter with owner if not filtered and request.user: - default_filter_by_self = model_setting.get("default_filter_by_self",False) - if default_filter_by_self: - user_id_field = model_setting.get("user_id_field") - if user_id_field: - q = q.filter(getattr(model.c,user_id_field)==request.user.id) - filtered = True + owner_filtered,q = self._filter_owner(model,model_setting,q) o = q.one() if o: o = o.to_dict() From 14d8d16ae93488058260c2fbb9eff22e6aa6b92a Mon Sep 17 00:00:00 2001 From: Chunlin Zhang Date: Fri, 14 Dec 2018 16:23:38 +0800 Subject: [PATCH 2/4] refactor _get_array to new apijson model settings --- demo/apps/apijson_demo/views.py | 8 ++--- uliweb_apijson/apijson/views.py | 58 ++++++++++++++++++++++++++------- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/demo/apps/apijson_demo/views.py b/demo/apps/apijson_demo/views.py index 8b03568..6646283 100644 --- a/demo/apps/apijson_demo/views.py +++ b/demo/apps/apijson_demo/views.py @@ -10,17 +10,17 @@ def index(): user_info = "not login, you can login with username 'admin/usera/userb/userc', and password '123'" request_get = [ { - "label":"Single record query: with id as parameter", + "label":"Single record query: no parameter", "value":'''{ "user":{ - "id":1 } }''', }, { - "label":"Single record query: no parameter", + "label":"Single record query: with id as parameter", "value":'''{ "user":{ + "id":1 } }''', }, @@ -33,7 +33,7 @@ def index(): }''', }, { - "label":"Array query: private data", + "label":"Array query", "value":'''{ "[]":{ "@count":2, diff --git a/uliweb_apijson/apijson/views.py b/uliweb_apijson/apijson/views.py index dd80d60..b5c6959 100644 --- a/uliweb_apijson/apijson/views.py +++ b/uliweb_apijson/apijson/views.py @@ -23,7 +23,7 @@ def __begin__(self): def get(self): for key in self.request_data: if key[-2:]=="[]": - rsp = self._query_array(key) + rsp = self._get_array(key) else: rsp = self._get_one(key) if rsp: return rsp @@ -42,6 +42,8 @@ def _get_one(self,key): return json({"code":400,"msg":"model '%s' not found"%(modelname)}) model_column_set = None q = model.all() + + #rbac check begin rbac_get = model_setting.get("rbac_get",{}) if not rbac_get: return json({"code":401,"msg":"'%s' not accessible by apijson"%(modelname)}) @@ -74,6 +76,7 @@ def _get_one(self,key): if not permission_check_ok: return json({"code":401,"msg":"no permission"}) + #rbac check end filtered = False @@ -111,7 +114,7 @@ def _get_one(self,key): del o[k] self.rdict[key] = o - def _query_array(self,key): + def _get_array(self,key): params = self.request_data[key] query_count = None query_page = None @@ -146,9 +149,8 @@ def _query_array(self,key): return json({"code":400,"msg":"no model found in array query"}) #model settings - model_setting = settings.APIJSON_MODEL.get(modelname,{}) + model_setting = settings.APIJSON_MODELS.get(modelname,{}) secret_fields = model_setting["secret_fields"] - public = model_setting.get("public",False) #model params #column @@ -165,6 +167,47 @@ def _query_array(self,key): model_order = model_param.get("@order") q = model.all() + + #rbac check begin + rbac_get = model_setting.get("rbac_get",{}) + if not rbac_get: + return json({"code":401,"msg":"'%s' not accessible by apijson"%(modelname)}) + + roles = rbac_get.get("roles") + perms = rbac_get.get("perms") + params_role = params.get("@role") + permission_check_ok = False + user_role = None + if params_role: + if params_role not in roles: + return json({"code":401,"msg":"'%s' not accessible by role '%s'"%(modelname,params_role)}) + if functions.has_role(request.user,params_role): + permission_check_ok = True + user_role = params_role + else: + return json({"code":401,"msg":"user doesn't have role '%s'"%(params_role)}) + if not permission_check_ok and roles: + for role in roles: + if functions.has_role(request.user,role): + permission_check_ok = True + user_role = role + break + + if not permission_check_ok and perms: + for perm in perms: + if functions.has_permission(request.user,perm): + permission_check_ok = True + break + + if not permission_check_ok: + return json({"code":401,"msg":"no permission"}) + #rbac check end + + if user_role == "OWNER": + owner_filtered,q = self._filter_owner(model,model_setting,q) + if not owner_filtered: + return json({"code":401,"msg":"'%s' cannot filter with owner"%(modelname)}) + if query_count: if query_page: q = q.offset(query_page*query_count) @@ -183,13 +226,6 @@ def _query_array(self,key): column = getattr(model.c,sort_key) q = q.order_by(getattr(column,sort_order)()) - if not public: - if not request.user: - return json({"code":401,"msg":"'%s' not accessable for unauthorized request"%(modelname)}) - owner_filtered,q = self._filter_owner(model,model_setting,q) - if not owner_filtered: - return json({"code":401,"msg":"'%s' not accessable because not public"%(modelname)}) - def _get_info(i): d = i.to_dict() if secret_fields: From 6eed78ba8e69a2b0187b27e337b2df1c69b71483 Mon Sep 17 00:00:00 2001 From: Chunlin Zhang Date: Fri, 14 Dec 2018 16:32:36 +0800 Subject: [PATCH 3/4] update document and screenshot --- demo/doc/imgs/demo_screenshot.png | Bin 31570 -> 53394 bytes uliweb_apijson/apijson/README.md | 168 ++---------------------------- 2 files changed, 9 insertions(+), 159 deletions(-) diff --git a/demo/doc/imgs/demo_screenshot.png b/demo/doc/imgs/demo_screenshot.png index ac484ffcf1feb7178795c92d9e695698ed1b1e0a..5a8c248df3ca2a3d9603b70eaba01eced43e08a1 100644 GIT binary patch literal 53394 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 literal 31570 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 diff --git a/uliweb_apijson/apijson/README.md b/uliweb_apijson/apijson/README.md index 77bad7e..98314fa 100644 --- a/uliweb_apijson/apijson/README.md +++ b/uliweb_apijson/apijson/README.md @@ -9,10 +9,11 @@ uliweb-apijson is a subset and slightly different variation of [apijson](https:/ ``` [APIJSON_MODEL_CONFIG] user = { - "public" : False, "user_id_field" : "id", "secret_fields" : ["password"], - "default_filter_by_self" : True + "rbac_get" : { + "roles" : ["ADMIN","OWNER"] + } } ``` @@ -20,163 +21,12 @@ user = { settings.APIJSON_MODEL_CONFIG.[MODEL_NAME] -| Field | Doc | -| ---------------------- | ------------------------------------------------------------ | -| public | Default to be "False".
If not public, should be **login user** and only can see **user own data**. | -| user_id_field | Field name of user id, related to query user own data. | -| secret_fields | Secret fields won't be exposed. | -| default_filter_by_self | If True, when no filter parameter, will filter by self user id | +| Field | Doc | +| ------------- | ---------------------------------------------------------- | +| user_id_field | Field name of user id, related to query user own data. | +| secret_fields | Secret fields won't be exposed. | +| rbac_get | Configure of roles or permissions for apijson 'get' method | # Supported API Examples -### Single record query: with id as parameter - -URL: apijson/get - -Method: POST - -Request: - -``` -{ - "user":{ - "id":1 - } -} -``` - -Response: - -``` -{ - "code": 200, - "msg": "success", - "user": { - "username": "usera", - "nickname": "User A", - "email": "usera@localhost", - "is_superuser": false, - "last_login": null, - "date_join": "2018-12-05 15:44:26", - "image": "", - "active": false, - "locked": false, - "deleted": false, - "auth_type": "default", - "id": 1 - } -} -``` - -### Single record query: no parameter - -URL: apijson/get - -Method: POST - -Request: - -``` -{ - "user":{ - } -} -``` - -Response: - -``` -{ - "code": 200, - "msg": "success", - "user": { - "username": "usera", - "nickname": "User A", - "email": "usera@localhost", - "is_superuser": false, - "last_login": null, - "date_join": "2018-12-05 15:44:26", - "image": "", - "active": false, - "locked": false, - "deleted": false, - "auth_type": "default", - "id": 1 - } -} -``` - -### Single record query: @column - -URL: apijson/get - -Method: POST - -Request: - -``` -{ - "user":{ - "@column": "id,username,email" - } -} -``` - -Response: - -``` -{ - "code": 200, - "msg": "success", - "user": { - "username": "usera", - "email": "usera@localhost", - "id": 1 - } -} -``` - -### Array query - -URL: apijson/get - -Method: POST - -Request: - -``` -{ - "[]":{ - "@count":2, - "@page":0, - "user":{ - "@column":"id,username,nickname,email", - "@order":"id-" - } - } -} -``` - -Response: - -``` -{ - "code": 200, - "msg": "success", - "[]": [ - { - "username": "userc", - "nickname": "User C", - "email": "userc@localhost", - "id": 3 - }, - { - "username": "userb", - "nickname": "User B", - "email": "userb@localhost", - "id": 2 - } - ] -} -``` - +Please run [demo](../../demo/README.md) project and try it. From ef703f393adcf50c453fb8be7cbee8dcc0380d59 Mon Sep 17 00:00:00 2001 From: Chunlin Zhang Date: Fri, 14 Dec 2018 16:35:10 +0800 Subject: [PATCH 4/4] fix document --- uliweb_apijson/apijson/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uliweb_apijson/apijson/README.md b/uliweb_apijson/apijson/README.md index 98314fa..ad0508d 100644 --- a/uliweb_apijson/apijson/README.md +++ b/uliweb_apijson/apijson/README.md @@ -7,7 +7,7 @@ uliweb-apijson is a subset and slightly different variation of [apijson](https:/ ## example ``` -[APIJSON_MODEL_CONFIG] +[APIJSON_MODELS] user = { "user_id_field" : "id", "secret_fields" : ["password"],