django.contirb.auth- 인증

6836 단어
먼저middleware의 정의를 살펴보겠습니다.
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:    
        #     

좋은 웹페이지 즐겨찾기