django 이중 시스템 사용자 검증 원리 실현

4137 단어 django
django 로그인 원리 실현
쓰다
django 자체 auth 모듈로 사용자 검증 로그인 가능
사용자가 사이트에 로그인하면django는 두 개의 중간 키를 통해 사용자의 로그인을 검증한다.
django.contrib.sessions.middleware.SessionMiddleware 및
django.contrib.auth.middleware.AuthenticationMiddleware
쓰다
1. 사용자가 로그인에 성공하면 서버는sessionid를 생성하여 데이터베이스에 저장하고 사용자 브라우저 쿠키에 쓰기
2. 사용자가 다시 방문하면 먼저 중간 키인 Session Middleware는sessionid라는 쿠키를 읽고 이 값에 따라 데이터베이스를 조회하고 사용자 id를 가져와session 대상을 생성합니다
3. 그리고 중간에 Authentication Middleware를 만들어서session 대상에 따라 사용자user 대상을 가져와 Request로 저장합니다.user
4. 대응하는 보기 함수를 처리할 때 리퀘스트에 저장된 해당user 대상에 대해 로그인 여부를 판단할 수 있습니다
 
쓰다
중간 Authentication Middleware
파일:django/contrib/auth/middleware.py
from django.contrib import auth
from django.core.exceptions import ImproperlyConfigured


class LazyUser(object):
    def __get__(self, request, obj_type=None):
        if not hasattr(request, '_cached_user'):
            from django.contrib.auth import get_user
            request._cached_user = get_user(request)
        return request._cached_user


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'."
        request.__class__.user = LazyUser()
        return None

 
이중 시스템 사용자 검증 원리를 실현하다
쓰다
이중 시스템 사용자 검증을 실현하려면 정상적인django 검증 절차에 따라 로그인 검증의 중간부품을 다시 쓰지 않습니다
구체적인 실현 원리:
사용자가 시스템 A에 접근할 것을 요청하면 시스템 A 중간부품도 상응하는 쿠키 값을 먼저 읽는다.쿠키 값을 받은 후 정상적인 절차처럼 데이터베이스에 조회하여user 대상을 가져오지 않습니다
그리고 이 값을 시스템 B에 보내고 시스템 B가 검증하며 시스템 B가 검증을 통과하면 이 사용자의username을 보내고 통과하지 못하면 빈 값을 보냅니다.
시스템 A에서 username을 가져오면 auth사용자 테이블에서 검색하고 없으면 사용자 개체(get or create)를 생성합니다.
마지막으로 사용자 대상을 Request에 저장합니다.사용자
 
구체적 조작
쓰다
1.setting 파일의 중간부품'django.contrib.auth.middleware.AuthenticationMiddleware',
자신의 중간부품으로 바꾸기'myauth.middleware.AuthenticationMiddleware',
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    #'django.contrib.auth.middleware.AuthenticationMiddleware',
    'myauth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

 
쓰다
2. app myauth를 만들고 파일middleware를 만듭니다.py
 
myauth/middleware.py
from django.conf import settings
from django.contrib.auth.models import AnonymousUser, User



class LazyUser(object):
    def __get__(self, request, obj_type=None):
        if not hasattr(request, '_cached_user'):
            #from django.contrib.auth import get_user
            request._cached_user = get_user(request)
        return request._cached_user


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'."
        request.__class__.user = LazyUser()


def get_user(request):
    session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
    user_dict = get_user_from_icnet(session_key)
    if user_dict:
        user, iscreate = User.objects.get_or_create(username=user_dict['username'])
    else:
        user = AnonymousUser()
    return user

def get_user_from_icnet(session_key):
    user_dict = {'username': 'test'}
    return user_dict

 

좋은 웹페이지 즐겨찾기