Browse Source
feat: implement Swagger authentication and permissions for admin and token users
master
feat: implement Swagger authentication and permissions for admin and token users
master
5 changed files with 128 additions and 6 deletions
-
42apps/api/decorators.py
-
60apps/api/permissions.py
-
13apps/api/views/swagger_views.py
-
10config/urls.py
-
9templates/swagger/ui.html
@ -0,0 +1,42 @@ |
|||||
|
from functools import wraps |
||||
|
from django.http import HttpResponseForbidden |
||||
|
from django.contrib.auth.models import AnonymousUser |
||||
|
from django.views.decorators.csrf import csrf_exempt |
||||
|
from rest_framework.authtoken.models import Token |
||||
|
|
||||
|
|
||||
|
def swagger_auth_required(view_func): |
||||
|
""" |
||||
|
Decorator that requires either admin authentication or valid swagger token |
||||
|
""" |
||||
|
@csrf_exempt |
||||
|
@wraps(view_func) |
||||
|
def _wrapped_view(request, *args, **kwargs): |
||||
|
# Check if user is admin |
||||
|
if request.user and request.user.is_authenticated and request.user.is_staff: |
||||
|
return view_func(request, *args, **kwargs) |
||||
|
|
||||
|
# Check swagger token in session |
||||
|
swagger_token = request.session.get('swagger_token') |
||||
|
if swagger_token: |
||||
|
try: |
||||
|
token_obj = Token.objects.get(key=swagger_token) |
||||
|
if token_obj.user.is_active: |
||||
|
return view_func(request, *args, **kwargs) |
||||
|
except Token.DoesNotExist: |
||||
|
pass |
||||
|
|
||||
|
# Check Authorization header |
||||
|
auth_header = request.META.get('HTTP_AUTHORIZATION', '') |
||||
|
if auth_header.startswith('Token '): |
||||
|
token = auth_header.split(' ')[1] |
||||
|
try: |
||||
|
token_obj = Token.objects.get(key=token) |
||||
|
if token_obj.user.is_active: |
||||
|
return view_func(request, *args, **kwargs) |
||||
|
except Token.DoesNotExist: |
||||
|
pass |
||||
|
|
||||
|
return HttpResponseForbidden("Access denied. Admin authentication or valid token required.") |
||||
|
|
||||
|
return _wrapped_view |
||||
@ -0,0 +1,60 @@ |
|||||
|
from rest_framework import permissions |
||||
|
from rest_framework.authtoken.models import Token |
||||
|
from django.contrib.auth.models import AnonymousUser |
||||
|
|
||||
|
|
||||
|
class SwaggerTokenPermission(permissions.BasePermission): |
||||
|
""" |
||||
|
Custom permission for Swagger that allows access to authenticated users via token |
||||
|
or admin users via session authentication |
||||
|
""" |
||||
|
|
||||
|
def has_permission(self, request, view): |
||||
|
# Check if user is admin (for session-based access) |
||||
|
if request.user and request.user.is_authenticated and request.user.is_staff: |
||||
|
return True |
||||
|
|
||||
|
# Check for token in session (from our custom auth system) |
||||
|
swagger_token = request.session.get('swagger_token') |
||||
|
if swagger_token: |
||||
|
try: |
||||
|
token_obj = Token.objects.get(key=swagger_token) |
||||
|
if token_obj.user.is_active: |
||||
|
return True |
||||
|
except Token.DoesNotExist: |
||||
|
pass |
||||
|
|
||||
|
# Check for Authorization header |
||||
|
auth_header = request.META.get('HTTP_AUTHORIZATION', '') |
||||
|
if auth_header.startswith('Token '): |
||||
|
token = auth_header.split(' ')[1] |
||||
|
try: |
||||
|
token_obj = Token.objects.get(key=token) |
||||
|
if token_obj.user.is_active: |
||||
|
return True |
||||
|
except Token.DoesNotExist: |
||||
|
pass |
||||
|
|
||||
|
return False |
||||
|
|
||||
|
|
||||
|
class IsAdminOrSwaggerToken(permissions.BasePermission): |
||||
|
""" |
||||
|
Permission that allows access to admin users or users with valid swagger token |
||||
|
""" |
||||
|
|
||||
|
def has_permission(self, request, view): |
||||
|
# Allow admin users |
||||
|
if request.user and request.user.is_authenticated and request.user.is_staff: |
||||
|
return True |
||||
|
|
||||
|
# Check swagger token in session |
||||
|
swagger_token = request.session.get('swagger_token') |
||||
|
if swagger_token: |
||||
|
try: |
||||
|
token_obj = Token.objects.get(key=swagger_token) |
||||
|
return token_obj.user.is_active |
||||
|
except Token.DoesNotExist: |
||||
|
pass |
||||
|
|
||||
|
return False |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue