comparison doc/rest.txt @ 5843:da1f40b5148d

issue2551050 document mechanism to allow uers limited access to privileged info that can be accessed by expansion of a template. Example used was searching the user's roles property for a Developer role.
author John Rouillard <rouilj@ieee.org>
date Thu, 11 Jul 2019 20:31:00 -0400
parents 8e17c34a5cf0
children d5aed7106ee6 a0eaae3f638b
comparison
equal deleted inserted replaced
5842:9c6617857032 5843:da1f40b5148d
1209 1209
1210 1210
1211 Adding other endpoints (e.g. to allow an OPTIONS query against 1211 Adding other endpoints (e.g. to allow an OPTIONS query against
1212 ``/data/issue/@schema``) is left as an exercise for the reader. 1212 ``/data/issue/@schema``) is left as an exercise for the reader.
1213 1213
1214 Controlling Access to Backend Data
1215 ==================================
1216
1217 Roundup's schema is the primary access control mechanism. Roles and
1218 Permissions provide the ability to carefully control what data can be
1219 seen.
1220
1221 However the templating system can access the hyperdb directly which
1222 allows filtering to happen with admin privs escaping the standard
1223 permissions scheme. For example access to a user's roles should be
1224 limited to the user (read only) and an admin. If you have customized
1225 your schema to implement `Restricting the list of
1226 users that are assignable to a task <customizing.html#restricting-the-list-of-users-that-are-assignable-to-a-task>`__ so that only users with a
1227 Developer role are allowed to be assigned to an issue, a rest end
1228 point must be added to provide a view that exposes users with this
1229 permission.
1230
1231 Using the normal ``/data/user?roles=Developer`` will return all the
1232 users in the system unless you are an admin user because most users
1233 can't see the roles. Building on the `Adding new rest endpoints`_
1234 section this code adds a new endpoint `/data/@permission/Developer`
1235 that returns a list of users with the developer role::
1236
1237 from roundup.rest import Routing, RestfulInstance
1238 from cgi import MiniFieldStorage
1239
1240 class RestfulInstance(object):
1241
1242 @Routing.route("/data/@permission/Developer")
1243 def get_role_Developer(self, input):
1244 '''An endpoint to return a list of users with Developer
1245 role who can be assigned to an issue.
1246
1247 It ignores attempt to search by any property except
1248 username and realname. It also ignores the whole @fields
1249 specification if it specifies a property the user
1250 can't view. Other @ query params (e.g. @page... and
1251 @verbose) are supported.
1252
1253 It assumes admin access rights so that the roles property
1254 of the user can be searched. This is needed if the roles
1255 property is not searchable/viewable by normal users. A user
1256 who can search roles can identify users with the admin
1257 role. So it does not respond the same as a rest/data/users
1258 search by a non-admin user.
1259 '''
1260 # get real user id
1261 realuid=self.db.getuid()
1262
1263 def allowed_field(fs):
1264 if fs.name in ['username', 'realname' ]:
1265 # only allow search matches for these fields
1266 return True
1267 elif fs.name in [ '@fields' ]:
1268 for prop in fs.value.split(','):
1269 # if any property is unviewable to user, remove
1270 # @field entry. If they can't see it for the admin
1271 # user, don't let them see it for any user.
1272 if not self.db.security.hasPermission(
1273 'View', realuid, 'user', property=prop,
1274 itemid='1'):
1275 return False
1276 return True
1277 elif fs.name.startswith("@"):
1278 # allow @page..., @verbose etc.
1279 return True
1280
1281 # deny all other url parmeters
1282 return False
1283
1284 # Cleanup input.list to prevent user from probing roles
1285 # or viewing things the user should not be able to view.
1286 input.list[:] = [ fs for fs in input.list
1287 if allowed_field(fs) ]
1288
1289 # Add the role filter required to implement the permission
1290 # search
1291 input.list.append(MiniFieldStorage("roles", "Developer"))
1292
1293 # change user to acquire permission to search roles
1294 self.db.setCurrentUser('admin')
1295
1296 # Once we have cleaned up the request, pass it to
1297 # get_collection as though /rest/data/users?... has been called
1298 # to get @verbose and other args supported.
1299 return self.get_collection('user', input)
1300
1301 Calling this with: `curl 'http://example.com/demo/rest/data/@permission/Developer?@fields=realname&roles=Users&@verbose=2'`
1302 produces output similar to::
1303
1304 {
1305 "data": {
1306 "collection": [
1307 {
1308 "username": "agent",
1309 "link": http://example.com/demo/rest/data/user/4",
1310 "realname": "James Bond",
1311 "id": "4"
1312 }
1313 ],
1314 "@total_size": 1
1315 }
1316 }
1317
1318 assuming user 4 is the only user with the Developer role. Note that
1319 the url passes the `roles=User` filter option which is silently
1320 ignored.
1321
1322
1214 Creating Custom Rate Limits 1323 Creating Custom Rate Limits
1215 =========================== 1324 ===========================
1216 1325
1217 You can replace the default rate limiter that is configured using 1326 You can replace the default rate limiter that is configured using
1218 the tracker's ``config.ini``. You can return different rate 1327 the tracker's ``config.ini``. You can return different rate

Roundup Issue Tracker: http://roundup-tracker.org/