Skip to content

Commit 2ac63a0

Browse files
authored
Merge pull request #1 from StackStorm/pluggable_rbac_backends_v30
Pluggable RBAC backends
2 parents c592795 + 7522794 commit 2ac63a0

File tree

129 files changed

+1259
-13731
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+1259
-13731
lines changed

scripts/travis/install-requirements.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/usr/bin/env bash
22

33
if [ "${TASK}" = 'compilepy3 ci-py3-unit' ] || [ "${TASK}" = 'ci-py3-integration' ]; then
4-
pip install "tox==3.5.2"
4+
pip install "tox==3.7.0"
55

66
# Install runners
77
. virtualenv/bin/activate

st2api/st2api/controllers/base.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from six.moves.urllib import parse as urlparse # pylint: disable=import-error
1919

2020
from st2api.controllers.controller_transforms import transform_to_bool
21-
from st2common.rbac import utils as rbac_utils
21+
from st2common.rbac.backends import get_rbac_backend
2222

2323
__all__ = [
2424
'BaseRestControllerMixin'
@@ -77,6 +77,7 @@ def _get_mask_secrets(self, requester_user, show_secrets=None):
7777
"""
7878
mask_secrets = cfg.CONF.api.mask_secrets
7979

80+
rbac_utils = get_rbac_backend().get_utils_class()
8081
if show_secrets and rbac_utils.user_is_admin(user_db=requester_user):
8182
mask_secrets = False
8283

st2api/st2api/controllers/resource.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from st2common.models.system.common import ResourceReference
2828
from st2common.exceptions.db import StackStormDBObjectNotFoundError
2929
from st2common.exceptions.rbac import ResourceAccessDeniedPermissionIsolationError
30-
from st2common.rbac import utils as rbac_utils
30+
from st2common.rbac.backends import get_rbac_backend
3131
from st2common.exceptions.rbac import AccessDeniedError
3232
from st2common.util import schema as util_schema
3333
from st2common.router import abort
@@ -277,6 +277,7 @@ def _get_one_by_id(self, id, requester_user, permission_type, exclude_fields=Non
277277
include_fields=include_fields)
278278

279279
if permission_type:
280+
rbac_utils = get_rbac_backend().get_utils_class()
280281
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
281282
resource_db=instance,
282283
permission_type=permission_type)
@@ -314,6 +315,7 @@ def _get_one_by_name_or_id(self, name_or_id, requester_user, permission_type,
314315
include_fields=include_fields)
315316

316317
if permission_type:
318+
rbac_utils = get_rbac_backend().get_utils_class()
317319
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
318320
resource_db=instance,
319321
permission_type=permission_type)
@@ -485,6 +487,7 @@ def resource_model_filter(self, model, instance, requester_user=None, **from_mod
485487

486488
return result
487489

490+
rbac_utils = get_rbac_backend().get_utils_class()
488491
user_is_admin = rbac_utils.user_is_admin(user_db=requester_user)
489492
user_is_system_user = (requester_user.name == cfg.CONF.system_user.user)
490493

@@ -524,6 +527,7 @@ def _get_one(self, ref_or_id, requester_user, permission_type, exclude_fields=No
524527
return
525528

526529
if permission_type:
530+
rbac_utils = get_rbac_backend().get_utils_class()
527531
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
528532
resource_db=instance,
529533
permission_type=permission_type)
@@ -617,6 +621,7 @@ def validate_limit_query_param(limit, requester_user=None):
617621
Note: We only perform max_page_size check for non-admin users. Admin users
618622
can provide arbitrary limit value.
619623
"""
624+
rbac_utils = get_rbac_backend().get_utils_class()
620625
user_is_admin = rbac_utils.user_is_admin(user_db=requester_user)
621626

622627
if limit:

st2api/st2api/controllers/v1/action_views.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from st2common.persistence.action import Action
3030
from st2common.persistence.runner import RunnerType
3131
from st2common.rbac.types import PermissionType
32-
from st2common.rbac import utils as rbac_utils
32+
from st2common.rbac.backends import get_rbac_backend
3333
from st2common.router import abort
3434
from st2common.router import Response
3535

@@ -90,6 +90,7 @@ def _get_one(action_id, requester_user):
9090
action_db = LookupUtils._get_action_by_id(action_id)
9191

9292
permission_type = PermissionType.ACTION_VIEW
93+
rbac_utils = get_rbac_backend().get_utils_class()
9394
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
9495
resource_db=action_db,
9596
permission_type=permission_type)
@@ -210,6 +211,7 @@ def get_one(self, ref_or_id, requester_user):
210211
action_db = self._get_by_ref_or_id(ref_or_id=ref_or_id)
211212

212213
permission_type = PermissionType.ACTION_VIEW
214+
rbac_utils = get_rbac_backend().get_utils_class()
213215
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
214216
resource_db=action_db,
215217
permission_type=permission_type)

st2api/st2api/controllers/v1/actionalias.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
from st2common.models.api.action import ActionAliasAPI
2424
from st2common.persistence.actionalias import ActionAlias
2525
from st2common.rbac.types import PermissionType
26-
from st2common.rbac import utils as rbac_utils
27-
26+
from st2common.rbac.backends import get_rbac_backend
2827
from st2common.router import abort
2928
from st2common.router import Response
3029
from st2common.util.actionalias_matching import get_matching_alias
@@ -119,6 +118,7 @@ def post(self, action_alias, requester_user):
119118
"""
120119

121120
permission_type = PermissionType.ACTION_ALIAS_CREATE
121+
rbac_utils = get_rbac_backend().get_utils_class()
122122
rbac_utils.assert_user_has_resource_api_permission(user_db=requester_user,
123123
resource_api=action_alias,
124124
permission_type=permission_type)
@@ -151,6 +151,7 @@ def put(self, action_alias, ref_or_id, requester_user):
151151
action_alias_db)
152152

153153
permission_type = PermissionType.ACTION_ALIAS_MODIFY
154+
rbac_utils = get_rbac_backend().get_utils_class()
154155
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
155156
resource_db=action_alias_db,
156157
permission_type=permission_type)
@@ -190,6 +191,7 @@ def delete(self, ref_or_id, requester_user):
190191
action_alias_db)
191192

192193
permission_type = PermissionType.ACTION_ALIAS_DELETE
194+
rbac_utils = get_rbac_backend().get_utils_class()
193195
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
194196
resource_db=action_alias_db,
195197
permission_type=permission_type)

st2api/st2api/controllers/v1/actionexecutions.py

+10-8
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,12 @@
4747
from st2common.services import action as action_service
4848
from st2common.services import executions as execution_service
4949
from st2common.services import trace as trace_service
50-
from st2common.services import rbac as rbac_service
5150
from st2common.util import isotime
5251
from st2common.util import action_db as action_utils
5352
from st2common.util import param as param_utils
5453
from st2common.util.jsonify import try_loads
5554
from st2common.rbac.types import PermissionType
56-
from st2common.rbac import utils as rbac_utils
57-
from st2common.rbac.utils import assert_user_has_resource_db_permission
58-
from st2common.rbac.utils import assert_user_is_admin_if_user_query_param_is_provided
55+
from st2common.rbac.backends import get_rbac_backend
5956

6057
__all__ = [
6158
'ActionExecutionsController'
@@ -118,13 +115,16 @@ def _handle_schedule_execution(self, liveaction_api, requester_user, context_str
118115
abort(http_client.BAD_REQUEST, message)
119116

120117
# Assert the permissions
121-
assert_user_has_resource_db_permission(user_db=requester_user, resource_db=action_db,
122-
permission_type=PermissionType.ACTION_EXECUTE)
118+
permission_type = PermissionType.ACTION_EXECUTE
119+
rbac_utils = get_rbac_backend().get_utils_class()
120+
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
121+
resource_db=action_db,
122+
permission_type=permission_type)
123123

124124
# Validate that the authenticated user is admin if user query param is provided
125125
user = liveaction_api.user or requester_user.name
126-
assert_user_is_admin_if_user_query_param_is_provided(user_db=requester_user,
127-
user=user)
126+
rbac_utils.assert_user_is_admin_if_user_query_param_is_provided(user_db=requester_user,
127+
user=user)
128128

129129
try:
130130
return self._schedule_execution(liveaction=liveaction_api,
@@ -169,6 +169,7 @@ def _schedule_execution(self, liveaction, requester_user, action_db, user=None,
169169
# Include RBAC context (if RBAC is available and enabled)
170170
if cfg.CONF.rbac.enable:
171171
user_db = UserDB(name=user)
172+
rbac_service = get_rbac_backend().get_service_class()
172173
role_dbs = rbac_service.get_roles_for_user(user_db=user_db, include_remote=True)
173174
roles = [role_db.name for role_db in role_dbs]
174175
liveaction.context['rbac'] = {
@@ -299,6 +300,7 @@ def get(self, id, attribute, requester_user):
299300
action_exec_db = self.access.impl.model.objects.filter(id=id).only(*fields).get()
300301

301302
permission_type = PermissionType.EXECUTION_VIEW
303+
rbac_utils = get_rbac_backend().get_utils_class()
302304
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
303305
resource_db=action_exec_db,
304306
permission_type=permission_type)

st2api/st2api/controllers/v1/actions.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from st2common.models.api.action import ActionAPI
3434
from st2common.persistence.pack import Pack
3535
from st2common.rbac.types import PermissionType
36-
from st2common.rbac import utils as rbac_utils
36+
from st2common.rbac.backends import get_rbac_backend
3737
from st2common.router import abort
3838
from st2common.router import Response
3939
from st2common.validators.api.misc import validate_not_part_of_system_pack
@@ -100,6 +100,7 @@ def post(self, action, requester_user):
100100
"""
101101

102102
permission_type = PermissionType.ACTION_CREATE
103+
rbac_utils = get_rbac_backend().get_utils_class()
103104
rbac_utils.assert_user_has_resource_api_permission(user_db=requester_user,
104105
resource_api=action,
105106
permission_type=permission_type)
@@ -144,6 +145,7 @@ def put(self, action, ref_or_id, requester_user):
144145

145146
# Assert permissions
146147
permission_type = PermissionType.ACTION_MODIFY
148+
rbac_utils = get_rbac_backend().get_utils_class()
147149
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
148150
resource_db=action_db,
149151
permission_type=permission_type)
@@ -199,6 +201,7 @@ def delete(self, ref_or_id, requester_user):
199201
action_id = action_db.id
200202

201203
permission_type = PermissionType.ACTION_DELETE
204+
rbac_utils = get_rbac_backend().get_utils_class()
202205
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
203206
resource_db=action_db,
204207
permission_type=permission_type)

st2api/st2api/controllers/v1/aliasexecution.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16+
import six
1617
import jsonschema
1718
from jinja2.exceptions import UndefinedError
1819
from oslo_config import cfg
1920

20-
import six
21-
2221
from st2api.controllers.base import BaseRestControllerMixin
2322
from st2common import log as logging
2423
from st2common.exceptions.actionalias import ActionAliasAmbiguityException
@@ -39,7 +38,7 @@
3938
from st2common.util.actionalias_matching import get_matching_alias
4039
from st2common.util.jinja import render_values as render
4140
from st2common.rbac.types import PermissionType
42-
from st2common.rbac.utils import assert_user_has_resource_db_permission
41+
from st2common.rbac.backends import get_rbac_backend
4342
from st2common.router import abort
4443
from st2common.router import Response
4544

@@ -220,8 +219,11 @@ def _schedule_execution(self, action_alias_db, params, notify, context, requeste
220219
if not action_db:
221220
raise StackStormDBObjectNotFoundError('Action with ref "%s" not found ' % (action_ref))
222221

223-
assert_user_has_resource_db_permission(user_db=requester_user, resource_db=action_db,
224-
permission_type=PermissionType.ACTION_EXECUTE)
222+
rbac_utils = get_rbac_backend().get_utils_class()
223+
permission_type = PermissionType.ACTION_EXECUTE
224+
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
225+
resource_db=action_db,
226+
permission_type=permission_type)
225227

226228
try:
227229
# prior to shipping off the params cast them to the right type.

st2api/st2api/controllers/v1/auth.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from st2common.exceptions.db import StackStormDBObjectNotFoundError
2929
from st2common.persistence.auth import ApiKey, User
3030
from st2common.rbac.types import PermissionType
31-
from st2common.rbac import utils as rbac_utils
31+
from st2common.rbac.backends import get_rbac_backend
3232
from st2common.router import abort
3333
from st2common.router import Response
3434
from st2common.util import auth as auth_util
@@ -77,6 +77,7 @@ def get_one(self, api_key_id_or_key, requester_user, show_secrets=None):
7777
abort(http_client.NOT_FOUND, msg)
7878

7979
permission_type = PermissionType.API_KEY_VIEW
80+
rbac_utils = get_rbac_backend().get_utils_class()
8081
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
8182
resource_db=api_key_db,
8283
permission_type=permission_type)
@@ -127,6 +128,7 @@ def post(self, api_key_api, requester_user):
127128
"""
128129

129130
permission_type = PermissionType.API_KEY_CREATE
131+
rbac_utils = get_rbac_backend().get_utils_class()
130132
rbac_utils.assert_user_has_resource_api_permission(user_db=requester_user,
131133
resource_api=api_key_api,
132134
permission_type=permission_type)
@@ -175,6 +177,7 @@ def put(self, api_key_api, api_key_id_or_key, requester_user):
175177
api_key_db = ApiKey.get_by_key_or_id(api_key_id_or_key)
176178

177179
permission_type = PermissionType.API_KEY_MODIFY
180+
rbac_utils = get_rbac_backend().get_utils_class()
178181
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
179182
resource_db=api_key_db,
180183
permission_type=permission_type)
@@ -221,6 +224,7 @@ def delete(self, api_key_id_or_key, requester_user):
221224
api_key_db = ApiKey.get_by_key_or_id(api_key_id_or_key)
222225

223226
permission_type = PermissionType.API_KEY_DELETE
227+
rbac_utils = get_rbac_backend().get_utils_class()
224228
rbac_utils.assert_user_has_resource_db_permission(user_db=requester_user,
225229
resource_db=api_key_db,
226230
permission_type=permission_type)

st2api/st2api/controllers/v1/inquiries.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from st2common.models.api import inquiry as inqy_api_models
3030
from st2common.persistence import execution as ex_db_access
3131
from st2common.rbac import types as rbac_types
32-
from st2common.rbac import utils as rbac_utils
32+
from st2common.rbac.backends import get_rbac_backend
3333
from st2common import router as api_router
3434
from st2common.services import inquiry as inquiry_service
3535

@@ -222,6 +222,7 @@ def _get_one_by_id(self, id, requester_user, permission_type,
222222
LOG.debug('Checking permission on inquiry "%s".' % id)
223223

224224
if permission_type:
225+
rbac_utils = get_rbac_backend().get_utils_class()
225226
rbac_utils.assert_user_has_resource_db_permission(
226227
user_db=requester_user,
227228
resource_db=execution_db,

0 commit comments

Comments
 (0)