본문 바로가기
source-code/Django

Blogs App _ 인증 기능 with 사용자 지정

by mattew4483 2021. 1. 7.
728x90
반응형

인증 기능을 개발할 때 django의 User 테이블을 통해 만들었다.

즉 이미 django에서 정해준 값만을 입력할 수 있었다!!

 

당연히 항상 이런 상황만 생기지는 않는다.

그렇기 때문에 이번에는 직접 User 모델을 생성하고 회원가입 및 로그인도 구현해볼 예정.


우선 가장 중요한...사항....!

지난번 django의 User는 별다른 설정 없이, migrate를 했을 때 자동으로 생성됨을 알아봤다!

그런데 이걸 마음대로 커스텀하면...? 기존의 User와의 충돌이 거의 백 프로! 생기고 만다.

이때 해결방법은? 

간단하다! 데이터베이스를 몽땅 날리고, User커스텀을 완료한 후 새로 migrate 해주면 된다. 참 쉽다!

 

1. accounts 앱 생성

회원가입을 담당하는 accounts라는 앱을 새로 만들었다.

startapp과 settings 등록은 이제 그냥 세트!

 

settings.py

또한 settigns.py 제일 밑에 앞으로 User는 우리가 커스텀 한 녀석임을 알려준다.

 

2. model 생성

우리는 django의 기본 유저 모델, 즉 User 대신 커스텀 유저 모델을 사용할 예정.

이를 위해 BaseUserManager, AbstractBaseUser, PermissionsMixin ← 요 삼총사를 이용한다.

 

models.py

으악!!! 

이 녀석은 나중에 다루자.

 

models.py

첫째, 우리가 커스텀할 User를 새로 만들어준다.

이름을 BlogUser로 지어줬고, AbstractBaseUser와 PermissionMixin을 상속받았다.

 

이 모델은 BlogUser를 만들 때 입력해야 하는 field를 설정해준다.

즉 user_id, username, user_phone 등 우리가 새롭게 유저 정보를 입력받을 수 있는 것!

 

그리고 이렇게 제공받은 값들로 진짜 유저를 생성해줘야 한다!

이를 위해 objects = BlogUserManager() 를 적어주자.

으잉? BlogUserManager는 또 뭘까.

그게 바로 이 녀석.

이 녀석을 통해 이용자가 회원가입을 했을 때, 일반 유저인지 관리자 유저인지를 구분해서 진행할 수 있다.

create_user는 일반 유저, create_superuser는 관리자 유저!

 

makemigrations - migrate 후 createsuperuser를 통해 관리자 계정을 만들면...!

이렇게 일반적인 계정 생성과는 다른 화면을 만날 수 있다. 와우!

 

3. 로그인

1) view 작성

views.py

로그인을 담당하는 LoginView!

일단 POST 요청이 들어오면, 요청의 username과 password를 각각의 이름으로 저장.

 

다음은 auth 패키지의 authenticate() 함수를 이용한다!

요 함수는 settings의 AUTHENTICATION_BACKENDS 에 등록된 인증 체계 기반 클래스를 가져와 인증을 시도한다.

즉 우리가 지정해준 AUTH_USER_MODEL 에서(여기서는 BlogUser) username에 해당하는 객체를 가져와,

이 녀석의 password와 제출된 password가 일치하는지를 비교!

(user = authenticate(request, username=username, password=password)

 

해당 user가 있을 경우(if user is Not None) 마찬가지로 auth 패키지의 login() 함수를 사용해 로그인시킨다!

그렇지 않을 경우 에러 메시지를 띄우도록!

 

2) templates 작성

login.html

form을 통해 POST 요청을 보내주자! 

input 태그를 통해 username과 password를 입력받을 거다.

input type password는? 사용자가 입력 시 해당 내용이 *** 으로 나타난다! 비밀번호에 안성맞춤.

또한 각 input 태그에 name을 달아줘 view에서 각 제출 내용이 username과 password임을 알려주자!

 

accounts/login/

쨘. 그럼 이렇게 뜬다. 로그인도 잘 되는 걸 확인할 수 있다!

 

4. 회원가입

1) view 작성

view.py

POST 요청이 들어오면 → BlogUser의 objects의 create_user에 해당 내용을 보내는데...

 

요놈들은 어디서 나온 거람?

models.py

아하! 이전에 만들어 둔 models.py에서 지정해준 녀석들이다.

즉 BlogUser의 objects는 BlogUserManager을 뜻하며,

이 녀석은 user_id, username, user_phone, password라는 값을 받으니,

view에서 이들을 지정해 넘겨준 것!

 

views.py

이런 식으로 이용자가 입력한 데이터를 해당 값들에 넣어줬다!

 

이후 이 user를 가입시키고, 다시 로그인 페이지로 redirect!

 

2) template 작성

register.html

마찬가지! form과 input을 이용해 이용자가 값을 입력하도록.

직접 form을 만들어 사용하는 게 가장 좋겠지만... 일단 이렇게 처리해보자.

 

accounts/register/

이용자가 데이터를 입력하면, 이를 토대로 새로운 BlogUser가 만들어진다!

권한 부여 등은 models.py의 create_user 항목에서 True/False로 지정해주면 된다.

 

5. 로그아웃

1) views 작성

views.py

와우! 역시 auth 패키지의 logout 함수를 이용하면 된다.

따로 코드를 고안할 필요가 없으니 참 좋다. 하하.

 

2) template 작성

logout.html

참으로 단출한 페이지. 로그아웃을 완료한 경우 띄워줄 화면이다.

 

accounts/logout/

로그인되어있을 때 Logout 버튼을 누르면 로그아웃이 이뤄지고, 해당 페이지로 이동.

728x90
반응형

'source-code > Django' 카테고리의 다른 글

Blogs App _ 좋아요 기능  (0) 2021.01.10
Blogs App _ 동적 페이지 만들기  (0) 2021.01.08
Blogs App _ CRUD with 함수형  (0) 2021.01.06
Blogs App _ CRUD  (0) 2021.01.05
Blogs App _ 인증 기능  (0) 2021.01.05