django.contirb.auth- 인증
auth 모듈에는 두 개의middleware가 있습니다: Authentication Middleware와Session Authentication Middleware입니다.
Authentication Middleware는 Request에 사용자 속성을 추가합니다.
class AuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session'), (
"The Django authentication middleware requires session middleware "
"to be installed. Edit your MIDDLEWARE_CLASSES setting to insert "
"'django.contrib.sessions.middleware.SessionMiddleware' before "
"'django.contrib.auth.middleware.AuthenticationMiddleware'."
)
request.user = SimpleLazyObject(lambda: get_user(request))
Authentication Middleware에서 사용자 정보를 저장하기 위해session 속성이 있는지 먼저 확인하는 것을 볼 수 있습니다.
사용자 속성의 추가가 get 로 지연되었습니다user () 함수에 있습니다.SimpleLazyObject는 지연 기술입니다.
SessionAuthenticationMiddleware의 정의를 살펴보겠습니다.
이것은session 검증을 책임진다
class SessionAuthenticationMiddleware(object):
"""
Middleware for invalidating a user's sessions that don't correspond to the
user's current session authentication hash (generated based on the user's
password for AbstractUser).
"""
def process_request(self, request):
user = request.user
if user and hasattr(user, 'get_session_auth_hash'):
session_hash = request.session.get(auth.HASH_SESSION_KEY)
session_hash_verified = session_hash and constant_time_compare(
session_hash,
user.get_session_auth_hash()
)
if not session_hash_verified:
auth.logout(request)
user의 get 비교를 통해session_auth_hash 방법, 세션 안의auth.HASH_SESSION_사용자의 세션이 정확한지 여부를 판단하는 KEY 속성입니다.
Request 안의user 대상에 대해 어떤 속성이 있는지 get 을 보십시오사용자 () 함수의 정의입니다.
def get_user(request):
if not hasattr(request, '_cached_user'):
request._cached_user = auth.get_user(request)
return request._cached_user
분명getuser 방법은 Request에 증가cached_사용자 속성, 캐시로 사용합니다.
사용자 인증은 데이터베이스를 조회하고 사용자의 정보를 얻어야 하기 때문에 비용을 줄이는 것이 필요하다.
이 캐시는 같은 Request에만 적용됩니다. 한view에서 여러 번 Request에 접근합니다.사용자 등록 정보.
매번 http 요청은 새로운 Request입니다.
이어서 auth를 보세요.get_사용자 () 방법의 정의, Request에 대한 깊은 이해.사용자:
def get_user(request):
"""
Returns the user model instance associated with the given request session.
If no user is retrieved an instance of `AnonymousUser` is returned.
"""
from .models import AnonymousUser
user = None
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
except KeyError:
pass
else:
if backend_path in settings.AUTHENTICATION_BACKENDS:
backend = load_backend(backend_path)
user = backend.get_user(user_id)
return user or AnonymousUser()
우선 클라이언트와 서버가session 메커니즘을 세웠다고 가정합니다. 이session의SESSIONKEY 속성은 user의 id 번호입니다.
이 세션의 BACKEND...SESSION_KEY 속성은 사용자 정보를 얻기 위해 사용할 백그라운드 기술을 지정하는 것입니다.마지막으로 백엔드를 사용합니다.get_user () 가 user를 가져옵니다.만족하지 않으면 AnonymousUser 객체로 돌아갑니다.
이에서user를 가져오는 과정에서 먼저 클라이언트와 서비스 측이 먼저session 메커니즘을 구축해야 한다는 전제가 있다.그렇다면 이 세션 메커니즘은 어떻게 만들어졌을까요?
이session이 세워진 과정은auth에 있습니다.login 함수:
def login(request, user):
"""
Persist a user id and a backend in the request. This way a user doesn't
have to reauthenticate on every request. Note that data set during
the anonymous session is retained when the user logs in.
"""
session_auth_hash = ''
if user is None:
user = request.user
if hasattr(user, 'get_session_auth_hash'):
session_auth_hash = user.get_session_auth_hash()
if SESSION_KEY in request.session:
if request.session[SESSION_KEY] != user.pk or (
session_auth_hash and
request.session.get(HASH_SESSION_KEY) != session_auth_hash):
# To avoid reusing another user's session, create a new, empty
# session if the existing session corresponds to a different
# authenticated user.
request.session.flush()
else:
request.session.cycle_key()
request.session[SESSION_KEY] = user.pk
request.session[BACKEND_SESSION_KEY] = user.backend
request.session[HASH_SESSION_KEY] = session_auth_hash
if hasattr(request, 'user'):
request.user = user
rotate_token(request)
우선 사용자 인증과 관련된session이 존재하는지 판단하고 있으면 데이터를 비우고 없으면 새로 만듭니다.
그런 다음 세션 값: SESSIONKEY, BACKEND_SESSION_KEY, HASH_SESSION_KEY.
그리고 로그인할 때 auth의 일반적인 방법을 사용합니다.
from django.contrib.auth import authenticate, login
def login_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
#
else: #
일반 제출은 POST 방식으로 제출하고 authenticate 방법 검증을 호출합니다. 성공한 후에login을 사용하여session을 만듭니다.
계속해서 authenticate의 정의를 보십시오:
def authenticate(**credentials):
"""
If the given credentials are valid, return a User object.
"""
for backend in get_backends():
try:
inspect.getcallargs(backend.authenticate, **credentials)
except TypeError:
# This backend doesn't accept these credentials as arguments. Try the next one.
continue
try:
user = backend.authenticate(**credentials)
except PermissionDenied:
# This backend says to stop in our tracks - this user should not be allowed in at all.
return None
if user is None:
continue
# Annotate the user object with the path of the backend.
user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__)
return user
# The credentials supplied are invalid to all backends, fire signal
user_login_failed.send(sender=__name__,
credentials=_clean_credentials(credentials))
백엔드를 호출하는 authenticate 방법으로 인증하기 위해 백엔드를 돌아가며 조회합니다.
다음에 사용자의 백엔드 속성을 업데이트했습니다. 이 사용자가 어떤 백엔드 인증 방식을 사용하는지 보여 줍니다.이 값은 login 함수에서session의 BACKEND 에 저장됩니다.SESSION_KEY 속성에서
backend의authenticate 방법을 통해 되돌아온user는 이 속성이 없습니다.
마지막으로 로그인 후auth의 사용법을 알려주세요.로그인할 때auth의 사용법을 보여 줍니다. 로그인 후session 메커니즘을 구축합니다.그래서 Request의user 속성을 직접 가져오면 사용자의 정보와 상태를 판단할 수 있습니다.
def my_view(request):
if request.user.is_authenticated():
#
else:
#
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.