Skip to main content

Django Authentication Introduction

What is Django Authentication?​

Django's authentication system is a robust framework that handles user accounts, groups, permissions, and cookie-based user sessions. It's designed to be secure, flexible, and adaptable to various project requirements.

The authentication system is one of Django's most valuable built-in features, saving developers significant time and ensuring security best practices are followed when managing users and their access to your application.

Why Authentication Matters​

Authentication is crucial for any web application that:

  • Has user-specific content
  • Requires restricted access to certain areas
  • Needs to track user actions
  • Stores user preferences or settings
  • Handles sensitive information

Building a secure authentication system from scratch is extremely challenging and prone to security vulnerabilities. Django's authentication system addresses these concerns with years of security expertise built-in.

Django's Authentication Components​

Django's authentication system consists of several key components:

  1. Users - The core user model with essential fields like username, password, email, etc.
  2. Groups - A way to categorize users and apply permissions to multiple users at once
  3. Permissions - Granular access controls for users or groups
  4. Authentication backends - Mechanisms to verify user credentials
  5. Password hashing - Secure storage of user passwords

Getting Started with Django Authentication​

Django's authentication system is included by default when you create a new project. To ensure it's properly configured:

1. Check Your Settings​

Make sure these apps are included in your INSTALLED_APPS setting:

python
INSTALLED_APPS = [
# ...
'django.contrib.auth', # Core authentication framework
'django.contrib.contenttypes', # Permission system dependency
# ...
]

Also, ensure the authentication middleware is present:

python
MIDDLEWARE = [
# ...
'django.contrib.sessions.middleware.SessionMiddleware', # Manages sessions
'django.contrib.auth.middleware.AuthenticationMiddleware', # Associates users with requests
# ...
]

2. Create the Authentication Tables​

If you haven't already, run migrations to create the necessary database tables:

bash
python manage.py migrate

3. Create a Superuser​

Create an admin user to test authentication:

bash
python manage.py createsuperuser

You'll be prompted to enter a username, email, and password:

Username: admin
Email address: admin@example.com
Password: ********
Password (again): ********
Superuser created successfully.

Basic Authentication Functions​

Here are some essential authentication functions you'll use frequently:

User Creation​

python
from django.contrib.auth.models import User

# Create a new user
user = User.objects.create_user(
username='johndoe',
email='john@example.com',
password='secure_password123'
)
user.save()

User Authentication​

python
from django.contrib.auth import authenticate, login, logout

# In a view function
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']

# Authenticate the user
user = authenticate(request, username=username, password=password)

if user is not None:
# Log the user in
login(request, user)
return redirect('home')
else:
# Authentication failed
return render(request, 'login.html', {'error': 'Invalid credentials'})

return render(request, 'login.html')

User Logout​

python
def logout_view(request):
logout(request)
return redirect('login')

Checking Authentication Status​

python
def some_protected_view(request):
if request.user.is_authenticated:
# User is logged in
return render(request, 'protected_page.html', {'user': request.user})
else:
# User is not logged in
return redirect('login')

Authentication Views and URLs​

Django provides ready-to-use authentication views. Here's how to include them in your urls.py:

python
from django.urls import path, include
from django.contrib.auth import views as auth_views

urlpatterns = [
# ...
path('accounts/login/', auth_views.LoginView.as_view(), name='login'),
path('accounts/logout/', auth_views.LogoutView.as_view(), name='logout'),
path('accounts/password_change/', auth_views.PasswordChangeView.as_view(), name='password_change'),
path('accounts/password_change/done/', auth_views.PasswordChangeDoneView.as_view(), name='password_change_done'),
# ...
# Or use the provided URLs all at once:
# path('accounts/', include('django.contrib.auth.urls')),
]

Protecting Views with Decorators​

Django provides decorators to restrict access to views:

python
from django.contrib.auth.decorators import login_required, permission_required

@login_required
def profile_view(request):
"""Only authenticated users can access this view."""
return render(request, 'profile.html')

@permission_required('app.can_approve')
def approve_comments(request):
"""Only users with the 'can_approve' permission can access this view."""
# View code here
return render(request, 'approve.html')

Real-world Example: User Registration and Login System​

Here's a practical example of implementing a basic user registration and login system:

1. Create forms.py​

python
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class SignUpForm(UserCreationForm):
email = forms.EmailField(max_length=254, help_text='Required. Provide a valid email address.')

class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')

2. Create views.py​

python
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from django.contrib.auth.decorators import login_required
from .forms import SignUpForm

def signup_view(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('home')
else:
form = SignUpForm()
return render(request, 'signup.html', {'form': form})

@login_required
def profile_view(request):
return render(request, 'profile.html')

3. Create URLs in urls.py​

python
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
path('signup/', views.signup_view, name='signup'),
path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(next_page='login'), name='logout'),
path('profile/', views.profile_view, name='profile'),
path('', views.home_view, name='home'),
]

4. Create templates​

For signup.html:

html
{% extends 'base.html' %}

{% block content %}
<h2>Sign up</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Sign up</button>
</form>
<p>Already have an account? <a href="{% url 'login' %}">Log in</a></p>
{% endblock %}

For login.html:

html
{% extends 'base.html' %}

{% block content %}
<h2>Log in</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Log in</button>
</form>
<p>Don't have an account? <a href="{% url 'signup' %}">Sign up</a></p>
{% endblock %}

Best Practices for Django Authentication​

  1. Never store passwords in plain text - Django handles this automatically with secure hashing
  2. Use HTTPS - Always use HTTPS in production to protect authentication data
  3. Set proper password policies - Encourage or enforce strong passwords
  4. Implement rate limiting - Prevent brute-force attacks by limiting login attempts
  5. Use secure cookies - Set SESSION_COOKIE_SECURE = True in production
  6. Consider two-factor authentication - For sensitive applications, add an extra layer of security

Summary​

In this introduction to Django Authentication, we've covered:

  • What Django Authentication is and why it matters
  • Core components of Django's authentication system
  • Setting up authentication in your project
  • Basic user management operations
  • Protecting views with login requirements
  • Building a practical registration and login system

Django's authentication system provides a solid foundation for managing users in your web applications. It handles the complex security aspects so you can focus on building your application's unique features.

Additional Resources​

Exercise Ideas​

  1. Create a complete user registration system with email verification
  2. Implement password reset functionality
  3. Create a user profile page that allows users to update their information
  4. Add social authentication (Google, Facebook, etc.) using django-allauth
  5. Implement role-based access control using Django groups and permissions


If you spot any mistakes on this website, please let me know at feedback@compilenrun.com. I’d greatly appreciate your feedback! :)