회원가입
User 객체를 Create 하는 과정
UserCreationForm()
회원 가입시 사용자 입력 데이터를 받는 built-in ModelForm
회원 가입 페이지 구현
1. urls.py에 path 추가
2. views.py에 signup 함수 추가하기
3. signup.html 작성하기
제출시 발생하는 오류
회원가입에 사용하는 UserCreationForm이 대체한 커스텀 유저 모델이 아닌 과거 Django의 기본 유저 모델로 인해 작성된 클래스로 되어있기 때문에 발생하는 오류
오류 해결 방법
UserCreationForm 과 UserChangeForm 은 둘다 class Meta: model =User 가 작성된 Form이기 때무네 재작성이 필요하다.
UserCreationForm 과 UserChangeForm 커스텀하기
get_user_model()
현재 프로젝트에서 활성화된 사용자 모델(active user model)을 반환하는 함수
User 모델을 직접 참조하지 않는 이유
- get_user_model()을 사용해 User 모델을 참조하면 커스텀 User 모델을 자동으로 반환해주기 때문
- Django는 필수적으로 User 클래스를 직접 참조하는 대신 get_user_model()을 사용해 참조해야 한다고 강조하고 있다.
User model 참조에 대한 자세한 내용은 추후 모델 관계에서 다를 예정
CustomUserCreationForm으로 변경
회원가입 완료!!
회원 탈퇴
User 객체를 Delete 하는 과정
회원 탈퇴 구현하기!!
1. urls.py에 path 추가
2. views.py에 delete 함수 추가하기
3. html에 회원탈퇴 버튼 추가하기
실행결과
회원정보 수정
User 객체를 Update 하는 과정
UserChangeForm()
회원 정보 수정 시 사용자 입력 데이터 받는 built-in ModelForm
이친구 역시 UserCreateForm()과 마찬가지로 meta클래스에 과거의 User 클래스가 작성되어 있어서 앞에서 미리 custom해줬다.
회원정보 수정 구현하기!!
1. urls.py 경로 추가하기
delete와 마찬가지로 요청객체 자체에 User가 들어있기 때문에 variable routing이 필요없다.
2. views.py에 update 함수 추가
3. update.html 작성하기
CustomUserChange에서 출력필드를 다시 조정하기
현재는 User 모델의 모든 정보들(fields)까지 출력되고 있다
일반 사용자들이 접근해서는 안되는 정보는 출력하지 않도록 조정이 필요함!!
https://docs.djangoproject.com/en/5.1/ref/contrib/auth/#fields
결과 하면
비밀번호 설정 부분은 아직 구현 X
비밀 번호에 폼 링크 클릭시 오류남!!
이렇게 추가해주면 없앨수 있긴 있다.
수정 확인!!
비밀번호 변경
인증된 사용자의 Session 데이터를 Update하는 과정
PasswordChangeForm()
비밀번호 변경시 사용자 입력 데이터를 받는 Built-in-Form
비밀번호 변경 구현하기
1. urls.py에 path 추가하기
- django는 비밀번호 변경 페이지를 회원정보 수정 form 하단에서 별도의 주소로 안내하고 있음
- user_pk/password → 앱의 url들은 모두 앱이름으로 시작하기 때문에 앱에서 쓰기는 어렵다
- 따라서 projcet/urls.py 에 경로를 설정해 주어야 한다!!
2. views.py 에 change_password 함수 추가하기
- PasswordChangeForm은 다른 Form 들과 인자 구성이 다르다
3. change_password.html 작성하기
- url 설정할때 app_name에 없다!!
결과 확인
암호 변경시 발생하는 문제!!
비밀번호 변경은 결과적으로 세션데이터를 바꾸는 것 때문에
- 기존 세션의 회원 인증 정보가 일치하지 않게 되어 버려서 로그인 상태가 유지되지 못하고 로그아웃 처리된다
- 비밀번호가 변경되면서 기존 세션과의 회원 인증 정보가 일치하지 않기 때문
update_session_auth_hash(request, user)
암호 변경 시 세션 무효화를 막아주는 함수
→ 암호가 변경되면 새로운 password의 Session Data로 기존 session을 자동으로 갱신
암호 변경시 세션 무효화 방지기능 추가!!
update_session_auth_hash(request, user) 적용!!
인증된 사용자에 대한 접근 제한
로그인 사용자에 대해 접근을 제한하는 2가지 방법
- is_authenticated 속성
- login_required 데코레이터
is_authenticated
사용자가 인증 되었는지 여부를 알 수 있는 User model의 속성
- 모든 User 인스턴스에 대해 항상 True인 읽기 전용 속성
- 비인증 사용자에 대해서는 항상 False
is_authenticated 적용하기
- {% request.user.is_authenticated %}
- 그냥 user을 쓰는것과 결과는 똑같지만 명시적으로 요청을 하는 유저라는걸 더 잘 보여줄 수 있음
- if 문으로 로그인과 비로그인상태에서 화면에 출력되는 링크를 다르게 설정하기
- 로그인한 사용자 로그인, 회원가입 못하게 막기(view에 함수에 맨앞에 추가)
- 이제 로그인 상태에서는 주소를 쳐서도 들어갈 수 있음
login_required
인증된 사용자에 대해서만 view 함수를 실행시키는 데코레이터
→ 비인증 사용자의 경우 /accounts/login/ 주소로 redirect 시킴(인증에 관한 앱을 accounts로 하면 편한 이유!!)
login_required 적용하기
인증된 사용자만 게시글을 작성/수정/삭제 할 수 있도록 수정
articles/view.py
인증된 사용자만 로그아웃/탈퇴/수정/비밀번호 변경할 수 있도록 수정
accounts/views.py
참고
is_authenticated 속성 코드
- 메서드가 아닌 속성 값임을 주의
- 만약 주소가 /accounts/login/ 이 아니라면 바꿀 수 있다
https://docs.djangoproject.com/en/5.1/topics/auth/default/#the-login-required-decorator
회원가입 후 자동로그인
회원가입 성공한 user 객체를 활용해 login 진행
회원 탈퇴 개선하기
현재 탈퇴를 클릭시에는 Session Data는 삭제되지 않고 그대로 남아있다.
탈퇴와 함께 기존 사용자의 Session Data 삭제방법
- 사용자 객체 삭제 이후 로그아웃 함수 호출
- 단 "탈퇴(1)후 로그아웃(2)" 의 순서가 바뀌면 안됨
- 먼저 로그아웃이 진행되면 해당 요청 객체 정보가 없어지기 때문에 탈퇴에 필요한 유저 정보 또한 없어지기 때문에
PasswordChangeForm의 인자 순서
- PasswordChangeForm이 다른 Form과 달리 user 객체를 첫번째 인자로 받는 이유
- 부모 클래스인 SetPasswordForm의 생성자 함수 구성을 따르기 때문
'Django' 카테고리의 다른 글
SQL 02 [Database] (0) | 2024.10.10 |
---|---|
SQL [Database] (0) | 2024.10.10 |
Authentication System 01 [Django] (0) | 2024.09.30 |
Django Template & URLs [Django] (0) | 2024.09.29 |
Static [Django] (3) | 2024.09.26 |