Complete Python SDK for interacting with the AuthLayer role-based access control (RBAC) contract on Stellar/Soroban.
pip install authlayer-sdk
# or
poetry add authlayer-sdkfrom authlayer import AuthLayer, Permission, AuthLayerConfig
# Initialize the client
config = AuthLayerConfig(
contract_id="CBDMK2XFZC5RWF5ZFRVX...",
rpc_url="https://soroban-testnet.stellar.org",
network_passphrase="Test SDF Network ; September 2015",
)
sg = AuthLayer(config)
# Create a role
result = sg.create_role(
admin="GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
role_name="manager",
permissions=[Permission.READ, Permission.WRITE, Permission.MANAGE_MEMBERS],
description="Manager role with read/write and member management"
)
print(f"Role created: {result.tx_hash}")
# Grant role to a member
sg.grant_role(
admin="GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
member="GYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
role_name="manager"
)
# Check if member has permission
has_write = sg.has_permission(
member="GYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
permission=Permission.WRITE
)
print(f"Has write permission: {has_write}")from stellar_guard import StellarGuardConfig
config = StellarGuardConfig(
contract_id="...", # Contract ID on Soroban
rpc_url="...", # RPC endpoint URL
network_passphrase="...", # Network passphrase
timeout=30000 # Optional timeout (ms)
)# Create role
sg.create_role(admin, "editor", [Permission.READ, Permission.WRITE])
# Get role details
role = sg.get_role("editor")
# List all roles
roles = sg.list_roles(limit=50, offset=0)
# Update role permissions
sg.update_role_permissions(admin, "editor", [Permission.READ])
# Delete role
sg.delete_role(admin, "editor")
# Check if role exists
exists = sg.role_exists("editor")# Grant role to member
sg.grant_role(admin, member, "editor")
# Revoke role
sg.revoke_role(admin, member, "editor")
# Check role
has_role = sg.has_role(member, "editor")
# Get member's roles
member_roles = sg.get_member_roles(member)
# Check permission
has_write = sg.has_permission(member, Permission.WRITE)
# Direct permission grants (bypass roles)
sg.grant_permission(admin, member, Permission.WRITE)
sg.revoke_permission(admin, member, Permission.WRITE)
# Check any of multiple permissions
has_any = sg.has_any_permission(member, [Permission.READ, Permission.WRITE])
# Check all permissions
has_all = sg.has_all_permissions(member, [Permission.READ, Permission.WRITE])from stellar_guard import RoleBasedPolicy
# Set access policy for resource
sg.set_access_policy(
admin,
"secret_data",
RoleBasedPolicy(roles=["manager", "admin"])
)
# Get access policy
policy = sg.get_access_policy("secret_data")
# Check resource access
can_access = sg.can_access_resource(member, "secret_data")# Grant delegation rights
sg.grant_delegation_rights(admin, delegator, "editor")
# Check delegation capability
can_delegate = sg.can_delegate_role(delegator, "editor")
# Member delegates role
sg.delegate_role(delegator, delegate, "editor")import time
# Grant role with expiration (timestamp in seconds)
sg.grant_role_with_expiry(
admin,
member,
"editor",
int(time.time()) + 86400 # 24 hours
)
# Get expiration time
expires_at = sg.get_role_expiry(member, "editor")
# Check if expired
is_expired = sg.is_role_expired(member, "editor")
# Cleanup expired roles
sg.cleanup_expired_roles(member)# Grant multiple roles
sg.grant_roles_batch(admin, member, ["editor", "reviewer"])
# Revoke multiple roles
sg.revoke_roles_batch(admin, member, ["editor", "reviewer"])
# Grant role to multiple members
sg.grant_role_to_members(admin, [member1, member2, member3], "viewer")# Get role member count
count = sg.get_role_member_count("editor")
# Get role members (paginated)
members = sg.get_role_members("editor", limit=50, offset=0)
# Get contract statistics
stats = sg.get_contract_stats()
# ContractStats(
# total_roles=5,
# total_members=100,
# total_permissions=45,
# last_updated=...
# )
# Verify member access (audit)
access = sg.verify_member_access(member)
# AccessCheckResult(
# can_access=True,
# roles=["editor"],
# permissions=[Permission.READ, Permission.WRITE]
# )Standard permissions:
from stellar_guard import Permission
Permission.READ # Read data
Permission.WRITE # Modify data
Permission.DELETE # Remove data
Permission.EXECUTE # Run functions
Permission.MANAGE_MEMBERS # Control users
Permission.MANAGE_ROLES # Create/edit roles
Permission.MANAGE_PERMISSIONS # Grant/revoke access
Permission.APPROVE # Authorization authorityCustom permissions:
from stellar_guard import CustomPermission
custom_perm = CustomPermission(value="custom_action")
sg.grant_permission(admin, member, custom_perm)Various access policy types:
from stellar_guard import (
PublicPolicy,
AuthenticatedPolicy,
RoleBasedPolicy,
PermissionBasedPolicy,
WhitelistPolicy,
CustomPolicy,
)
# Public - anyone
policy = PublicPolicy()
# Authenticated - any member
policy = AuthenticatedPolicy()
# Role-based - specific roles
policy = RoleBasedPolicy(roles=["admin", "manager"])
# Permission-based - specific permissions
policy = PermissionBasedPolicy(permissions=[Permission.READ, Permission.WRITE])
# Whitelist - explicit addresses
policy = WhitelistPolicy(addresses=["GXXX...", "GYYY..."])
# Custom - application logic
policy = CustomPolicy(value="custom_policy")from stellar_guard import (
StellarGuardError,
AuthorizationError,
RoleNotFoundError,
PermissionDeniedError,
InvalidInputError,
NetworkError,
TimeoutError,
ConfigurationError,
)
try:
sg.grant_role(admin, member, "nonexistent")
except RoleNotFoundError:
print("Role not found")
except AuthorizationError:
print("Not authorized")
except StellarGuardError as error:
print(f"Error ({error.code}): {error.message}")# Create role with custom permissions
sg.create_role(
admin,
"custom_role",
[
Permission.READ,
CustomPermission(value="publish_content"),
CustomPermission(value="moderate_comments"),
]
)
# Check custom permission
can_publish = sg.has_permission(
member,
CustomPermission(value="publish_content")
)All list operations support pagination:
response = sg.list_roles(limit=25, offset=50)
print({
"data": response.data,
"limit": response.limit,
"offset": response.offset,
"total": response.total,
"has_more": response.has_more,
})from stellar_guard import OperationOptions
sg.grant_role(
admin,
member,
"editor",
options=OperationOptions(
fee=100,
memo="Granting editor role",
timeout=60000
)
)create_role()- Create new roleget_role()- Get role detailslist_roles()- List all rolesupdate_role_permissions()- Update permissionsdelete_role()- Delete rolerole_exists()- Check existence
grant_role()- Assign rolerevoke_role()- Unassign rolehas_role()- Check roleget_member_roles()- List rolesgrant_permission()- Direct permissionrevoke_permission()- Revoke permissionhas_permission()- Check permissionhas_any_permission()- Check any (OR)has_all_permissions()- Check all (AND)grant_roles_batch()- Batch grantrevoke_roles_batch()- Batch revokegrant_role_to_members()- Bulk grantverify_member_access()- Audit check
set_access_policy()- Set policyget_access_policy()- Get policycan_access_resource()- Check access
grant_delegation_rights()- Allow delegationcan_delegate_role()- Check capabilitydelegate_role()- Member delegates
grant_role_with_expiry()- Expiring roleget_role_expiry()- Get expiryis_role_expired()- Check expirycleanup_expired_roles()- Cleanup
get_role_member_count()- Count membersget_role_members()- List membersget_contract_stats()- Statisticsverify_member_access()- Audit
pytest
pytest --cov=stellar_guard # With coveragepython -m buildContributions welcome! Please ensure:
- Type hints throughout
- Comprehensive docstrings
- Clear error handling
- Tests for new features
MIT
- GitHub: https://github.com/authlayer/authlayer
- Discord: AuthLayer community channel
- Docs: https://authlayer.dev
- Initial release
- Full RBAC API coverage
- Role management
- Permission system
- Access control
- Delegation
- Time-based roles
- Batch operations
- Comprehensive error handling