Skip to content

Commit 5a38a50

Browse files
authored
Use warrant create/delete endpoints (#11)
* Update self service create to support self service strategy * Use warrant create/delete for assign/remove methods * Fix lint error * Add object type constants
1 parent d1371a7 commit 5a38a50

File tree

8 files changed

+73
-46
lines changed

8 files changed

+73
-46
lines changed

examples/example.py

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@
2626
print(f"Created tenants: [{tenant1.id}, {tenant2.id}]")
2727
tenant1.assign_user(user1.id)
2828
print(f"Assigned user [{user1.id}] to tenant [{tenant1.id}]")
29-
tenant2.assign_user(user2.id)
30-
print(f"Assigned user [{user2.id}] to tenant [{tenant2.id}]")
29+
user2_subject = warrant.Subject("user", user2.id)
30+
warrant.Warrant.create("tenant", tenant1.id, "admin", user2_subject)
31+
print(f"Assigned user [{user2.id}] as admin to tenant [{tenant2.id}]")
3132
tenant1_users = ""
3233
for u in tenant1.list_users():
3334
tenant1_users += u.id + " "
@@ -143,8 +144,8 @@
143144
"""
144145
# Generate a self-service dashboard url for user2
145146
print("---------- FE & Self-service Authz Tokens ----------")
146-
user2.assign_permission("view-self-service-dashboard")
147-
print("Created self service dashboard url for user [" + user2.id + "]: " + warrant.Authz.create_self_service_url(tenant_id=tenant1.id, user_id=user2.id, redirect_url="http://example.com"))
147+
print("Created self service dashboard url for user [" + user2.id + "]: " +
148+
warrant.Authz.create_self_service_url(tenant_id=tenant1.id, user_id=user2.id, self_service_strategy="rbac", redirect_url="http://example.com"))
148149

149150
# Authz sessions
150151
print("Created authorization session token for user [" + user1.id + "]: " + warrant.Authz.create_authorization_session(user_id=user1.id))
@@ -156,24 +157,25 @@
156157
Create and query your own warrants
157158
"""
158159
print("---------- Create & Query Warrants ----------")
160+
permission1 = warrant.Permission.create(id="permission1")
159161
user1_subject = warrant.Subject("user", user1.id)
160-
result = warrant.Authz.check("permission", "view-self-service-dashboard", "member", user1_subject)
161-
print(f"Does [{user1.id}] have the [view-self-service-dashboard] permission? (should be false) -> {result}")
162-
warrant.Warrant.create("permission", "view-self-service-dashboard", "member", user1_subject)
163-
print("Manually assigned [view-self-service-dashboard] permission to [" + user1.id + "]")
164-
result = warrant.Authz.check("permission", "view-self-service-dashboard", "member", user1_subject)
165-
print(f"Does [{user1.id}] have the [view-self-service-dashboard] permission? (should be true) -> {result}")
162+
result = warrant.Authz.check("permission", "permission1", "member", user1_subject)
163+
print(f"Does [{user1.id}] have the [permission1] permission? (should be false) -> {result}")
164+
warrant.Warrant.create("permission", "permission1", "member", user1_subject)
165+
print("Manually assigned [permission1] permission to [" + user1.id + "]")
166+
result = warrant.Authz.check("permission", "permission1", "member", user1_subject)
167+
print(f"Does [{user1.id}] have the [permission1] permission? (should be true) -> {result}")
166168

167169
# Query warrants
168-
warrants = warrant.Warrant.query(select="explicit warrants", for_clause="subject=user:"+user1.id, where="relation=member")
169-
print("Query warrants results:")
170-
for w in warrants:
171-
print(f"[{w.object_type}:{w.object_id} {w.relation} {w.subject.object_type}:{w.subject.object_id}]")
172-
173-
warrant.Warrant.delete("permission", "view-self-service-dashboard", "member", user1_subject)
174-
print("Manually removed [view-self-service-dashboard] permission from [" + user1.id + "]")
175-
result = warrant.Authz.check("permission", "view-self-service-dashboard", "member", user1_subject)
176-
print(f"Does [{user1.id}] have the [view-self-service-dashboard] permission? (should be false) -> {result}")
170+
# warrants = warrant.Warrant.query(select="explicit warrants", for_clause="subject=user:"+user1.id, where="relation=member")
171+
# print("Query warrants results:")
172+
# for w in warrants:
173+
# print(f"[{w.object_type}:{w.object_id} {w.relation} {w.subject.object_type}:{w.subject.object_id}]")
174+
175+
warrant.Warrant.delete("permission", "permission1", "member", user1_subject)
176+
print("Manually removed [permission1] permission from [" + user1.id + "]")
177+
result = warrant.Authz.check("permission", "permission1", "member", user1_subject)
178+
print(f"Does [{user1.id}] have the [permission1] permission? (should be false) -> {result}")
177179
print("\n")
178180

179181

@@ -185,13 +187,12 @@
185187
user1.remove_permission(special_perm.id)
186188
user1.remove_role(admin_role.id)
187189
user2.remove_role(viewer_role.id)
188-
user2.remove_permission("view-self-service-dashboard")
189190
admin_role.remove_permission(create_report_perm.id)
190191
admin_role.remove_permission(delete_report_perm.id)
191192
admin_role.remove_permission(view_report_perm.id)
192193
viewer_role.remove_permission(view_report_perm.id)
193194
tenant1.remove_user(user1.id)
194-
tenant2.remove_user(user2.id)
195+
warrant.Warrant.delete("tenant", tenant1.id, "admin", user2_subject)
195196
enterprise_tier.remove_feature(analytics_feature.id)
196197
free_tier.remove_feature(dashboard_feature.id)
197198

@@ -205,6 +206,7 @@
205206
warrant.Permission.delete(delete_report_perm.id)
206207
warrant.Permission.delete(view_report_perm.id)
207208
warrant.Permission.delete(special_perm.id)
209+
warrant.Permission.delete(permission1.id)
208210
warrant.Feature.delete(analytics_feature.id)
209211
warrant.Feature.delete(dashboard_feature.id)
210212
warrant.PricingTier.delete(enterprise_tier.id)

warrant/authz.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ def create_authorization_session(cls, user_id):
3737
return json["token"]
3838

3939
@classmethod
40-
def create_self_service_url(cls, tenant_id, user_id, redirect_url):
40+
def create_self_service_url(cls, tenant_id, user_id, self_service_strategy, redirect_url):
4141
payload = {
4242
"type": "ssdash",
4343
"userId": user_id,
44-
"tenantId": tenant_id
44+
"tenantId": tenant_id,
45+
"selfServiceStrategy": self_service_strategy,
4546
}
4647
json = cls._post(uri="/v1/sessions", json=payload)
4748
token = json["token"]

warrant/constants.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
FEATURE_OBJECT_TYPE = "feature"
2+
PERMISSION_OBJECT_TYPE = "permission"
3+
PRICING_TIER_OBJECT_TYPE = "pricing-tier"
4+
ROLE_OBJECT_TYPE = "role"
5+
TENANT_OBJECT_TYPE = "tenant"
6+
USER_OBJECT_TYPE = "user"

warrant/feature.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from warrant import APIResource
1+
from warrant import APIResource, Subject, Warrant, constants
22

33

44
class Feature(APIResource):
@@ -34,11 +34,13 @@ def list_for_pricing_tier(cls, pricing_tier_id, list_params={}):
3434

3535
@classmethod
3636
def assign_to_pricing_tier(cls, pricing_tier_id, feature_id):
37-
cls._post(uri="/v1/pricing-tiers/"+pricing_tier_id+"/features/"+feature_id, json={})
37+
pricing_tier_subject = Subject(constants.PRICING_TIER_OBJECT_TYPE, pricing_tier_id)
38+
return Warrant.create(constants.FEATURE_OBJECT_TYPE, feature_id, "member", pricing_tier_subject)
3839

3940
@classmethod
4041
def remove_from_pricing_tier(cls, pricing_tier_id, feature_id):
41-
cls._delete(uri="/v1/pricing-tiers/"+pricing_tier_id+"/features/"+feature_id, params={})
42+
pricing_tier_subject = Subject(constants.PRICING_TIER_OBJECT_TYPE, pricing_tier_id)
43+
return Warrant.delete(constants.FEATURE_OBJECT_TYPE, feature_id, "member", pricing_tier_subject)
4244

4345
"""
4446
Tenants
@@ -49,11 +51,13 @@ def list_for_tenant(cls, tenant_id, list_params={}):
4951

5052
@classmethod
5153
def assign_to_tenant(cls, tenant_id, feature_id):
52-
cls._post(uri="/v1/tenants/"+tenant_id+"/features/"+feature_id, json={})
54+
tenant_subject = Subject(constants.TENANT_OBJECT_TYPE, tenant_id)
55+
return Warrant.create(constants.FEATURE_OBJECT_TYPE, feature_id, "member", tenant_subject)
5356

5457
@classmethod
5558
def remove_from_tenant(cls, tenant_id, feature_id):
56-
cls._delete(uri="/v1/tenants/"+tenant_id+"/features/"+feature_id, params={})
59+
tenant_subject = Subject(constants.TENANT_OBJECT_TYPE, tenant_id)
60+
return Warrant.delete(constants.FEATURE_OBJECT_TYPE, feature_id, "member", tenant_subject)
5761

5862
"""
5963
Users
@@ -64,11 +68,13 @@ def list_for_user(cls, user_id, list_params={}):
6468

6569
@classmethod
6670
def assign_to_user(cls, user_id, feature_id):
67-
cls._post(uri="/v1/users/"+user_id+"/features/"+feature_id, json={})
71+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
72+
return Warrant.create(constants.FEATURE_OBJECT_TYPE, feature_id, "member", user_subject)
6873

6974
@classmethod
7075
def remove_from_user(cls, user_id, feature_id):
71-
cls._delete(uri="/v1/users/"+user_id+"/features/"+feature_id, params={})
76+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
77+
return Warrant.delete(constants.FEATURE_OBJECT_TYPE, feature_id, "member", user_subject)
7278

7379
"""
7480
JSON serialization/deserialization

warrant/permission.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from warrant import APIResource
1+
from warrant import APIResource, Subject, Warrant, constants
22

33

44
class Permission(APIResource):
@@ -47,11 +47,13 @@ def list_for_user(cls, user_id, list_params={}):
4747

4848
@classmethod
4949
def assign_to_user(cls, user_id, permission_id):
50-
cls._post(uri="/v1/users/"+user_id+"/permissions/"+permission_id, json={})
50+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
51+
return Warrant.create(constants.PERMISSION_OBJECT_TYPE, permission_id, "member", user_subject)
5152

5253
@classmethod
5354
def remove_from_user(cls, user_id, permission_id):
54-
cls._delete(uri="/v1/users/"+user_id+"/permissions/"+permission_id, params={})
55+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
56+
return Warrant.delete(constants.PERMISSION_OBJECT_TYPE, permission_id, "member", user_subject)
5557

5658
"""
5759
Roles
@@ -62,11 +64,13 @@ def list_for_role(cls, role_id, list_params={}):
6264

6365
@classmethod
6466
def assign_to_role(cls, role_id, permission_id):
65-
return cls._post(uri="/v1/roles/"+role_id+"/permissions/"+permission_id, json={})
67+
role_subject = Subject(constants.ROLE_OBJECT_TYPE, role_id)
68+
return Warrant.create(constants.PERMISSION_OBJECT_TYPE, permission_id, "member", role_subject)
6669

6770
@classmethod
6871
def remove_from_role(cls, role_id, permission_id):
69-
return cls._delete(uri="/v1/roles/"+role_id+"/permissions/"+permission_id, params={})
72+
role_subject = Subject(constants.ROLE_OBJECT_TYPE, role_id)
73+
return Warrant.delete(constants.PERMISSION_OBJECT_TYPE, permission_id, "member", role_subject)
7074

7175
"""
7276
JSON serialization/deserialization

warrant/pricing_tier.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from warrant import APIResource, Feature
1+
from warrant import APIResource, Feature, Subject, Warrant, constants
22

33

44
class PricingTier(APIResource):
@@ -46,11 +46,13 @@ def list_for_tenant(cls, tenant_id, list_params={}):
4646

4747
@classmethod
4848
def assign_to_tenant(cls, tenant_id, pricing_tier_id):
49-
cls._post(uri="/v1/tenants/"+tenant_id+"/pricing-tiers/"+pricing_tier_id)
49+
tenant_subject = Subject(constants.TENANT_OBJECT_TYPE, tenant_id)
50+
return Warrant.create(constants.PRICING_TIER_OBJECT_TYPE, pricing_tier_id, "member", tenant_subject)
5051

5152
@classmethod
5253
def remove_from_tenant(cls, tenant_id, pricing_tier_id):
53-
cls._delete(uri="/v1/tenants/"+tenant_id+"/pricing-tiers/"+pricing_tier_id, params={})
54+
tenant_subject = Subject(constants.TENANT_OBJECT_TYPE, tenant_id)
55+
return Warrant.delete(constants.PRICING_TIER_OBJECT_TYPE, pricing_tier_id, "member", tenant_subject)
5456

5557
"""
5658
Users
@@ -61,11 +63,13 @@ def list_for_user(cls, user_id, list_params={}):
6163

6264
@classmethod
6365
def assign_to_user(cls, user_id, pricing_tier_id):
64-
cls._post(uri="/v1/users/"+user_id+"/pricing-tiers/"+pricing_tier_id)
66+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
67+
return Warrant.create(constants.PRICING_TIER_OBJECT_TYPE, pricing_tier_id, "member", user_subject)
6568

6669
@classmethod
6770
def remove_from_user(cls, user_id, pricing_tier_id):
68-
cls._delete(uri="/v1/users/"+user_id+"/pricing-tiers/"+pricing_tier_id, params={})
71+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
72+
return Warrant.delete(constants.PRICING_TIER_OBJECT_TYPE, pricing_tier_id, "member", user_subject)
6973

7074
"""
7175
JSON serialization/deserialization

warrant/role.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from warrant import APIResource, Permission
1+
from warrant import APIResource, Permission, Subject, Warrant, constants
22

33

44
class Role(APIResource):
@@ -47,11 +47,13 @@ def list_for_user(cls, user_id, list_params={}):
4747

4848
@classmethod
4949
def assign_to_user(cls, user_id, role_id):
50-
cls._post(uri="/v1/users/"+user_id+"/roles/"+role_id, json={})
50+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
51+
return Warrant.create(constants.ROLE_OBJECT_TYPE, role_id, "member", user_subject)
5152

5253
@classmethod
5354
def remove_from_user(cls, user_id, role_id):
54-
cls._delete(uri="/v1/users/"+user_id+"/roles/"+role_id, params={})
55+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
56+
return Warrant.delete(constants.ROLE_OBJECT_TYPE, role_id, "member", user_subject)
5557

5658
"""
5759
Permissions

warrant/user.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from warrant import APIResource, PricingTier, Feature, Role, Permission, Authz, Subject
1+
from warrant import APIResource, PricingTier, Feature, Role, Permission, Authz, Subject, Warrant, constants
22

33

44
class User(APIResource):
@@ -43,11 +43,13 @@ def delete(cls, id):
4343
"""
4444
@classmethod
4545
def assign_to_tenant(cls, tenant_id, user_id):
46-
cls._post(uri="/v1/tenants/"+tenant_id+"/users/"+user_id, json={})
46+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
47+
return Warrant.create(constants.TENANT_OBJECT_TYPE, tenant_id, "member", user_subject)
4748

4849
@classmethod
4950
def remove_from_tenant(cls, tenant_id, user_id):
50-
cls._delete(uri="/v1/tenants/"+tenant_id+"/users/"+user_id, params={})
51+
user_subject = Subject(constants.USER_OBJECT_TYPE, user_id)
52+
return Warrant.delete(constants.TENANT_OBJECT_TYPE, tenant_id, "member", user_subject)
5153

5254
"""
5355
Roles

0 commit comments

Comments
 (0)