mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-30 14:07:05 -05:00
feat: Implement MFA authentication, add ride statistics model, and update various services, APIs, and tests across the application.
This commit is contained in:
@@ -1,10 +1,13 @@
|
||||
from django.db.models.signals import post_save, pre_save
|
||||
from django.dispatch import receiver
|
||||
import requests
|
||||
from django.contrib.auth.models import Group
|
||||
from django.db import transaction
|
||||
from django.contrib.auth.signals import user_logged_in
|
||||
from django.core.files import File
|
||||
from django.core.files.temp import NamedTemporaryFile
|
||||
import requests
|
||||
from django.db import transaction
|
||||
from django.db.models.signals import post_save, pre_save
|
||||
from django.dispatch import receiver
|
||||
|
||||
from .login_history import LoginHistory
|
||||
from .models import User, UserProfile
|
||||
|
||||
|
||||
@@ -185,3 +188,41 @@ def create_default_groups():
|
||||
print(f"Permission not found: {codename}")
|
||||
except Exception as e:
|
||||
print(f"Error creating default groups: {str(e)}")
|
||||
|
||||
|
||||
@receiver(user_logged_in)
|
||||
def log_successful_login(sender, user, request, **kwargs):
|
||||
"""
|
||||
Log successful login events to LoginHistory.
|
||||
|
||||
This signal handler captures the IP address, user agent, and login method
|
||||
for auditing and security purposes.
|
||||
"""
|
||||
try:
|
||||
# Get IP address
|
||||
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
||||
ip_address = x_forwarded_for.split(',')[0].strip() if x_forwarded_for else request.META.get('REMOTE_ADDR')
|
||||
|
||||
# Get user agent
|
||||
user_agent = request.META.get('HTTP_USER_AGENT', '')[:500]
|
||||
|
||||
# Determine login method from session or request
|
||||
login_method = 'PASSWORD'
|
||||
if hasattr(request, 'session'):
|
||||
sociallogin = getattr(request, '_sociallogin', None)
|
||||
if sociallogin:
|
||||
provider = sociallogin.account.provider.upper()
|
||||
if provider in ['GOOGLE', 'DISCORD']:
|
||||
login_method = provider
|
||||
|
||||
# Create login history entry
|
||||
LoginHistory.objects.create(
|
||||
user=user,
|
||||
ip_address=ip_address,
|
||||
user_agent=user_agent,
|
||||
login_method=login_method,
|
||||
success=True,
|
||||
)
|
||||
except Exception as e:
|
||||
# Don't let login history failure prevent login
|
||||
print(f"Error logging login history for user {user.username}: {str(e)}")
|
||||
|
||||
Reference in New Issue
Block a user