⚠️

아래 공식문서를 읽고 인증 관련된 내용 중 일부만 발췌해서 정리했습니다.

자세한 내용이 궁금하시다면 공식문서를 참고하시는 것을 추천드립니다. 

https://docs.djangoproject.com/en/5.0/topics/auth/customizing/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

✅django authentication

장고에서는 인증을 수행하기 위한 여러 백엔드 클래스(authentication backends)들이 있다. 

 

settings.py 설정 파일에서 AUTHENTICATION_BACKENDS 라는 변수 값으로 이 인증 백엔드 클래스를 어떻게 설정할지를 지정할 수 있다. 

 

인증 백엔드가 여러 개일 경우, 맨 위에 선언한 클래스부터 순차적으로 인증이 실행된다. 상위 클래스에서 인증이 완료되면 하위 클래스는 실행되지 않는다. 

 

기본값은 ModelBackend이다. 

AUTHENTICATION_BACKENDS = [
	"django.contrib.auth.backends.ModelBackend"
]

 

인증 백엔드는 세션과도 연관이 있다. 하나의 세션에서는 인증에 사용하는 백엔드를 캐싱해 두고 인증할 때 그 클래스를 사용한다. 

 

django.contrib.auth 모듈의 authenticate()를 호출하면 장고의 모든 인증 백엔드에서 순차적으로 인증을 시도한다. 

 

☑️login() vs authenticate()

인증을 수행한다는 공통점이 있다.

authenticate(): 인증 정보가 유효한지를 한 번 확인한다.

login(): 인증 정보가 유효한지를 확인하고 유효하다면 세션을 만드는 등의 후처리를 한다. 그 결과 한 번 인증된 유저를 여러 번 인증할 필요가 없게 한다. 

 

✅Custom Authentication

기본 인증을 사용하지 않고 새로운 인증 클래스를 만들어서 사용해야 할 때도 있다.

 

예를 들면 서로 다른 두 앱(django app)의 유저를 통합하거나 할 때, 두 앱에서 모두 사용할 수 있는 인증 클래스가 필요할 것이다. 

 

새로운 인증 백엔드 클래스(Authentication Backend)를 만들기 위해서는 크게 두 가지가 필요하다. 

  1. django.contrib.auth.backends 모듈의 BaseBackend 클래스를 상속하는 새 클래스 만들기
  2. 해당 클래스에서 두 가지 메소드 구현하기
  • authenticate: 요청 및 필요시 추가 정보(credentials)를 받아서 인증 되면 user, 아니면 None을 리턴한다. 
  • get_user: user 인스턴스의 pk 값을 받아서 user를 리턴한다. 
from django.contrib.auth.backends import BaseBackend

class CustomBackend(BaseBackend):

	def authenticate(self, request, credentials=None):
		...
        
	def get_user(self, user_id):
		...
        
   ...

 

 

✅Authentication Backend에서 권한(Permissions) 부여하기

BaseBackend 클래스에서는 User 모델 및 UserManager 클래스에서 정의하는 여러 권한 조회 함수들(permission lookup functions)을 사용할 수 있다. 

  • get_user_permissions: 해당 유저가 직접적으로 가진 권한들을 리턴한다. 
  • get_group_permissions: 해당 유저가 속한 그룹이 가진 권한들을 리턴한다. 
  • get_all_permissions: 위의 두 메소드의 합집합을 리턴한다. 
  • has_perm(perm): 유저가 해당 권한을 가지고 있는지를 boolean 값으로 리턴한다. 
  • has_module_perms(module_name): 유저가 해당 모듈(django app)에 해당하는 권한을 하나라도 갖고 있다면 True를 리턴한다. 

만약 시행 중 Permission Denied 에러가 리턴되면, 미들웨어처럼 이후의 인증 백엔드를 거치지 않고 에러를 리턴한다. 

 

✅특정 모델 인스턴스에 대해 권한 생성하기

모델 클래스의 Meta 옵션에 permissions 속성을 추가하고, 그 값으로 추가하고 싶은 권한들을 작성한다. 

권한들도 DB를 사용하는 경우 하나의 테이블로 맵핑되기 때문에, 이렇게 추가한 권한 값들은 migrate 명령어를 실행한 이후에 생성되므로 그 이후에 사용할 수 있다. 

class Task(models.Model):
	...
	class Meta:
		permissions = [
			("change_task_status", "Can change the status of tasks"),
			("close_task", "Can close the status of tasks"),
		]

 

 

참고한 포스트

https://stackoverflow.com/questions/28249276/whats-the-difference-between-authenticate-and-login

 

'server-side > Django' 카테고리의 다른 글

django customizing user  (0) 2024.01.07
django sessions  (0) 2024.01.06
django migrations  (0) 2023.12.31
django routers  (1) 2023.12.21
django apps  (0) 2023.12.20

+ Recent posts