Django ์ธ์ฆ ์์คํ
(Auth)
1. ๊ธฐ๋ณธ ๊ฐ์
Django๋ ๊ฐ๋ ฅํ ์ธ์ฆ/๊ถํ ์์คํ
์ ๊ธฐ๋ณธ ์ ๊ณต
ํต์ฌ ๊ธฐ๋ฅ | ์ค๋ช
|
๋ก๊ทธ์ธ/๋ก๊ทธ์์ | authenticate(),login(),logout()ํจ์๋ก ์ฒ๋ฆฌ |
ํ์๊ฐ์
| User ๋ชจ๋ธ๊ณผset_password()๋ก ์์ ํ ๋น๋ฐ๋ฒํธ ์ ์ฅ |
๋น๋ฐ๋ฒํธ ๊ด๋ฆฌ | ๋ณ๊ฒฝ ๋ฐ ์ฌ์ค์ ๊ธฐ๋ฅ (PasswordChangeView,PasswordResetView) |
์ธ์
๊ด๋ฆฌ | ๋ก๊ทธ์ธ ์ํ ์ ์ง,request.sessionํ์ฉ |
๊ถํ ๊ฒ์ฌ | is_authenticated,@login_required, ๊ทธ๋ฃน/ํผ๋ฏธ์
์์คํ
|
2. ๊ธฐ๋ณธ ์ธ์ฆ ํ๋ฆ
[ํผ ์
๋ ฅ] โ [view์์ ์ธ์ฆ ์์ฒญ] โ [์ธ์
์ ์ฅ] โ [ํ์ด์ง ์ด๋]
Plain Text
๋ณต์ฌ
3. ๊ธฐ๋ณธ User ๋ชจ๋ธ
from django.contrib.auth.models import User
Python
๋ณต์ฌ
ํ๋ | ์ค๋ช
|
username | ์ฌ์ฉ์ ์ด๋ฆ (unique) |
email | ์ด๋ฉ์ผ |
password | ํด์ ์ ์ฅ๋จ |
first_name | ์ด๋ฆ |
last_name | ์ฑ |
is_active, is_staff, is_superuser | ๊ถํ ๊ด๋ จ ํ๋ |
4. ๋ก๊ทธ์ธ ๋ทฐ ์์
from django.contrib.auth import authenticate, login
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user:
login(request, user)
return redirect('home')
else:
messages.error(request, '๋ก๊ทธ์ธ ์คํจ')
return render(request, 'accounts/login.html')
Python
๋ณต์ฌ
<!-- templates/accounts/login.html -->
<form method="post">
{% csrf_token %}
<input name="username" type="text" placeholder="์์ด๋">
<input name="password" type="password" placeholder="๋น๋ฐ๋ฒํธ">
<button type="submit">๋ก๊ทธ์ธ</button>
</form>
HTML
๋ณต์ฌ
5. ๋ก๊ทธ์์
from django.contrib.auth import logout
def logout_view(request):
logout(request)
return redirect('login')
Python
๋ณต์ฌ
6. ์ธ์ฆ ์ํ ํ์ธ ๋ฐ ์ ๊ทผ ์ ํ
# ๋ทฐ ํจ์ ๋ณดํธ
from django.contrib.auth.decorators import login_required
@login_required
def mypage(request):
return render(request, 'accounts/mypage.html')
Python
๋ณต์ฌ
<!-- ํ
ํ๋ฆฟ์์ ๋ก๊ทธ์ธ ์ํ ํ์ธ -->
{% if user.is_authenticated %}
{{ user.username }}๋ ํ์ํฉ๋๋ค.
<a href="{% url 'logout' %}">๋ก๊ทธ์์</a>
{% else %}
<a href="{% url 'login' %}">๋ก๊ทธ์ธ</a>
{% endif %}
HTML
๋ณต์ฌ
7. ์ฅ๊ณ ๊ธฐ๋ณธ ์ธ์ฆ URL ์ฐ๊ฒฐ
# settings.py
LOGIN_URL = '/accounts/login/'
LOGIN_REDIRECT_URL = '/'
# urls.py
from django.contrib.auth import views as auth_views
urlpatterns = [
path('accounts/login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login'),
path('accounts/logout/', auth_views.LogoutView.as_view(), name='logout'),
]
Python
๋ณต์ฌ
8. ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ / ์ฌ์ค์ ๊ธฐ๋ฅ
from django.contrib.auth import views as auth_views
urlpatterns += [
path('password_change/', auth_views.PasswordChangeView.as_view(), name='password_change'),
path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
]
Python
๋ณต์ฌ
ํ
ํ๋ฆฟ์ ๊ธฐ๋ณธ์ ์ผ๋ก registration/password_change_form.html ๋ฑ ๊ฒฝ๋ก ์ฌ์ฉ
9. ์ค์ต ์์ด๋์ด
์ค์ต ์ฃผ์ | ์ค๋ช
|
๋ก๊ทธ์ธ / ๋ก๊ทธ์์ ๊ตฌํ | ๊ธฐ๋ณธ ์ธ์ฆ ํ๋ฆ ์์ฑ |
๋ก๊ทธ์ธ ํ ์ ์ ์ ๋ณด ์ถ๋ ฅ | request.user ์ฌ์ฉ |
๋น๋ก๊ทธ์ธ ์ ์ ๊ทผ ์ ํ | @login_required ์ฌ์ฉ |
ํ์๊ฐ์
์ฐ๋ | ์์ SignupForm ์ค์ต๊ณผ ์ฐ๊ฒฐ |
10. ํ์ฅ ํ (๊ณ ๊ธ)
์ฃผ์ | ์ค๋ช
|
์ปค์คํ
User ๋ชจ๋ธ | AbstractUser ์์ |
์ด๋ฉ์ผ ๊ธฐ๋ฐ ๋ก๊ทธ์ธ | authenticate() ์ปค์คํฐ๋ง์ด์ง |
์์
๋ก๊ทธ์ธ | django-allauth, social-auth-app-django ํ์ฉ |
Django Auth ์ค์ต
1. Django ์ธ์ฆ ์์คํ
๊ฐ์
ํญ๋ชฉ | ์ค๋ช
|
User ๋ชจ๋ธ | Django ๋ด์ฅ ์ฌ์ฉ์ ๋ชจ๋ธ (๊ธฐ๋ณธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ ๊ณต) |
auth ์ฑ | ์ธ์ฆ, ๊ถํ ๋ถ์ฌ, ์ธ์
๊ด๋ฆฌ ๊ธฐ๋ฅ ํฌํจ |
์ธ์ฆ ํ๋ฆ | ์ฌ์ฉ์ โ ๋ก๊ทธ์ธ โ ์ธ์
๋ฐ๊ธ โ ๊ถํ ํ์ธ |
2. ๊ธฐ๋ณธ User ๋ชจ๋ธ ๊ตฌ์กฐ
from django.contrib.auth.models import User
Python
๋ณต์ฌ
ํ๋ | ์ค๋ช
|
username | ์ฌ์ฉ์ ID |
password | ํด์๋ ๋น๋ฐ๋ฒํธ |
email, first_name, last_name | ํ๋กํ ์ ๋ณด |
is_staff, is_superuser, is_active | ๊ถํ ๊ด๋ จ ํ๋ |
3. ํ์๊ฐ์
ํผ ์์
# accounts/forms.py
from django.contrib.auth.models import User
from django import forms
class SignupForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = ['username', 'email', 'password']
Python
๋ณต์ฌ
# views.py
def signup(request):
if request.method == "POST":
form = SignupForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.set_password(form.cleaned_data['password']) # ํด์ํ
user.save()
return redirect('login')
else:
form = SignupForm()
return render(request, 'accounts/signup.html', {'form': form})
Python
๋ณต์ฌ
4. ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ์์
from django.contrib.auth import authenticate, login
def login_view(request):
if request.method == 'POST':
uname = request.POST['username']
pw = request.POST['password']
user = authenticate(request, username=uname, password=pw)
if user is not None:
login(request, user)
return redirect('home')
return render(request, 'accounts/login.html')
Python
๋ณต์ฌ
5. ๋ก๊ทธ์์ ์ฒ๋ฆฌ
from django.contrib.auth import logout
def logout_view(request):
logout(request)
return redirect('login')
Python
๋ณต์ฌ
6. ๋ก๊ทธ์ธ ์ํ ํ์ธ & ์ ๊ทผ์ ํ
from django.contrib.auth.decorators import login_required
@login_required
def mypage(request):
return render(request, 'accounts/mypage.html')
Python
๋ณต์ฌ
๋๋ settings.py์์ ๋ก๊ทธ์ธ URL ์ค์
LOGIN_URL = '/accounts/login/'
Python
๋ณต์ฌ
7. ํ
ํ๋ฆฟ ๋ด ์ฌ์ฉ์ ์ํ ์ฒ๋ฆฌ
{% if user.is_authenticated %}
<p>{{ user.username }} ๋ ํ์ํฉ๋๋ค</p>
<a href="{% url 'logout' %}">๋ก๊ทธ์์</a>
{% else %}
<a href="{% url 'login' %}">๋ก๊ทธ์ธ</a>
{% endif %}
HTML
๋ณต์ฌ
8. ์ปค์คํ
User ๋ชจ๋ธ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
# accounts/models.py
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
nickname = models.CharField(max_length=30)
phone = models.CharField(max_length=20)
Python
๋ณต์ฌ
# settings.py
AUTH_USER_MODEL = 'accounts.CustomUser'
Python
๋ณต์ฌ
9. Admin์ ์ฌ์ฉ์ ๋ฑ๋ก
# accounts/admin.py
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser
@admin.register(CustomUser)
class CustomUserAdmin(UserAdmin):
fieldsets = UserAdmin.fieldsets + (
('์ถ๊ฐ ์ ๋ณด', {'fields': ('nickname', 'phone')}),
)
list_display = ('username', 'nickname', 'phone')
Python
๋ณต์ฌ
10. ์ค์ต ์์
์ค์ต๋ช
| ๋ชฉํ |
ํ์๊ฐ์
| ์ฌ์ฉ์ ์ ๋ณด ์ ์ฅ, ๋น๋ฐ๋ฒํธ ํด์ฑ ํ์ธ |
๋ก๊ทธ์ธ | authenticate์ login() ์ฌ์ฉ |
๋ก๊ทธ์์ | ์ธ์
์ข
๋ฃ ํ์ธ |
๋ง์ดํ์ด์ง | @login_required๋ก ์ ๊ทผ ์ ์ด |
ํ
ํ๋ฆฟ ์ํ ํ์ | ๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ฅธ ๋ฉ๋ด ํ์ |
์ปค์คํ
User ๋ชจ๋ธ ์ ์ฉ | ๋๋ค์, ์ฐ๋ฝ์ฒ ํ๋ ์ถ๊ฐ |
admin ๋ฑ๋ก | ๊ด๋ฆฌ์์์ ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ฒ |