AIDA Permissions
A flexible and powerful Django roles and permissions extension optimized for Django REST Framework and Vue.js frontends.
Features
- 🔐 Role-Based Access Control (RBAC) with inheritance support
- 🏢 Multi-tenancy ready with tenant isolation
- ⚡ Optimized for REST APIs with Django REST Framework integration
- 🎯 Vue.js components for frontend integration
- 🔄 Dynamic permissions that can be created and assigned at runtime
- ⏰ Time-based permissions with expiration support
- 🎨 Admin interface for easy management
- 🚀 High performance with intelligent caching
- 📝 Comprehensive audit logging
Requirements
- Python 3.8+
- Django 3.2, 4.0, 4.1, 4.2, 5.0, or 5.1
- Django REST Framework 3.12+
Custom User Model Support
AIDA Permissions fully supports custom Django User models, including:
- Models using email as the primary identifier (USERNAME_FIELD = 'email')
- Models without a username field
- Models with custom authentication fields
The extension automatically adapts to your User model configuration without requiring any additional setup.
Installation
Install using pip:
pip install aida-permissions
Add to your INSTALLED_APPS:
INSTALLED_APPS = [
# ...
'aida_permissions',
'rest_framework',
# ...
]
Add the middleware (optional but recommended):
MIDDLEWARE = [
# ...
'aida_permissions.middleware.PermissionMiddleware',
# ...
]
Run migrations:
python manage.py migrate aida_permissions
Initialize default permissions:
python manage.py init_permissions
Quick Start
1. Define Roles and Permissions
from aida_permissions.models import Role, Permission, PermissionCategory
# Create a permission category
category = PermissionCategory.objects.create(
name="products",
display_name="Product Management"
)
# Create permissions
view_permission = Permission.objects.create(
codename="products.view",
name="View Products",
category=category
)
edit_permission = Permission.objects.create(
codename="products.edit",
name="Edit Products",
category=category
)
# Create a role
manager_role = Role.objects.create(
name="product_manager",
display_name="Product Manager"
)
# Assign permissions to role
manager_role.add_permission(view_permission)
manager_role.add_permission(edit_permission)
2. Assign Roles to Users
from aida_permissions.models import UserRole
from django.contrib.auth import get_user_model
User = get_user_model()
# Works with any User model configuration
# For username-based models:
user = User.objects.get(username="john")
# For email-based models:
# user = User.objects.get(email="john@example.com")
# Assign role to user
UserRole.objects.create(
user=user,
role=manager_role
)
3. Check Permissions in Views
from rest_framework import viewsets
from aida_permissions.permissions import AidaPermission
class ProductViewSet(viewsets.ModelViewSet):
permission_classes = [AidaPermission]
# Define required permissions for each action
permission_required = {
'list': 'products.view',
'retrieve': 'products.view',
'create': 'products.create',
'update': 'products.edit',
'destroy': 'products.delete',
}
4. Check Permissions in Code
from aida_permissions.utils import has_permission
if has_permission(user, 'products.edit'):
# User can edit products
product.save()
5. Use in Templates (Vue.js)
<template>
<div>
<button v-if="can('products.edit')" @click="editProduct">
Edit Product
</button>
</div>
</template>
<script>
import { usePermissions } from '@/composables/usePermissions'
export default {
setup() {
const { can } = usePermissions()
return { can }
}
}
</script>
Advanced Features
Role Inheritance
# Create parent role
base_role = Role.objects.create(
name="employee",
display_name="Employee"
)
# Create child role that inherits permissions
manager_role = Role.objects.create(
name="manager",
display_name="Manager",
parent_role=base_role # Inherits all employee permissions
)
Time-based Permissions
from datetime import timedelta
from django.utils import timezone
# Assign role with expiration
UserRole.objects.create(
user=user,
role=temp_role,
expires_at=timezone.now() + timedelta(days=30)
)
Multi-tenancy Support
# Create tenant-specific role
role = Role.objects.create(
name="tenant_admin",
display_name="Tenant Admin",
tenant_id=tenant.id
)
# Check permission with tenant context
from aida_permissions.utils import PermissionChecker
checker = PermissionChecker(user, tenant_id=tenant.id)
if checker.has_permission('products.edit'):
# User can edit products in this tenant
pass
Custom Permission Conditions
# Add permission with conditions
role.add_permission(
permission,
conditions={
'department': 'sales',
'region': 'north'
}
)
API Endpoints
The package provides ready-to-use API endpoints:
GET /api/permissions/- List permissionsGET /api/roles/- List rolesPOST /api/roles/{id}/assign_permissions/- Assign permissions to roleGET /api/user-permissions/check/- Check current user permissionsPOST /api/user-roles/assign/- Assign role to user
Management Commands
# Initialize default permissions
python manage.py init_permissions
# Audit permissions usage
python manage.py audit_permissions
# Clean expired permissions
python manage.py cleanup_expired_permissions
Configuration
Add to your Django settings:
# Optional: Custom user model
AUTH_USER_MODEL = 'myapp.User'
# Optional: Caching backend for better performance
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}
# Optional: Default role for new users
AIDA_DEFAULT_ROLE = 'member'
# Optional: Permission check failure behavior
AIDA_PERMISSION_DENIED_RAISES = True
Testing
Run the test suite:
pytest
Contributing
Contributions are welcome! Please see our Contributing Guide for details.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
- Documentation: https://github.com/hmesfin/aida-permissions
- Issues: https://github.com/hmesfin/aida-permissions/issues
Author
- GitHub: @hmesfin
Acknowledgments
- Built with Django and Django REST Framework
- Inspired by django-guardian and django-role-permissions
Metadata
Release files for aida-permissions 1.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| aida_permissions-1.0.2.tar.gz | 46.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aida_permissions-1.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 79.2 kB
Release files / aida_permissions-1.0.2.tar.gz
| Download URL | aida_permissions-1.0.2.tar.gz |
|---|---|
| Size | 46.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dd9e27b15348cc384ae9d682c957512cdb4c78e67d1dbdb63515d845b194c92f
|
|
BLAKE2b-256 checksum How to use checksums |
3eeac9b7bfb62a7c9033feae2b75d0cc36d9c3a0bba870aa81c14b2608b7e798
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.11.3
|
Release files / aida_permissions-1.0.2-py3-none-any.whl
| Download URL | aida_permissions-1.0.2-py3-none-any.whl |
|---|---|
| Size | 32.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dbd22424d112b5e3840356c24671635b083dfd6aa403959524aa05c48e632d49
|
|
BLAKE2b-256 checksum How to use checksums |
5ff671102dd045d0fa3f681ed212415e65c7c2407f36a3e426f14629d6476a37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.11.3
|
Security for aida-permissions 1.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.