미들웨어 및 CSRF day61 장고 모듈 인증

첫째, 구성 파일 프로그래밍 아이디어를 기반으로

반사

문자열 조작 함수와 클래스에 의해

1. importlib 모듈

모듈을 대응 Importlib 모듈은 스트링을 통해 제거 될 수있다.

import importlib

res = 'lib.bbb'
# 利用字符串的形式导入模块
md = importlib.import_module(res)  
# from lib import bbb md相当于bbb
print(md)  # 该模块字符串最小单位只能到文件名

2. 프로필

우리가 모듈을 가져올 때, 우리는 실제로이 모듈 파일의 폴더 가져올 __init__.py파일을.

이 파일은 구성 정보 파일을 가져올 수 있습니다.

우리는 문자열의 형태로 작성된 구성 파일의 모듈에 수입 다른 특정 경로를 진출하게됩니다, 구성 정보를 저장합니다.

그런 다음 __init__.py실제 경로 가져 오기 모듈에 구성 정보 문자열을 구문 분석 모듈 구성 파일 importlib 가져온 파일을 통해.

그래서 우리는 모듈을 가져올 구성 파일에 문자열을 입력 할 수있는! 우리는 모듈과 일부 기능을 사용할 필요가없는 경우에, 우리는 라인 출력 구성 파일 주석의 경로 문자열을 지시합니다.

둘째, 크로스 사이트 요청 위조 (CSRF)

1.csrf 소개 및 원산지

크로스 사이트 요청 위조 : 크로스 사이트 요청 위조

일부 피싱 사이트 인터페이스와 같은 일반 사이트 작성 및 데이터를 제출하도록 사용자를 유도한다. 일반 사이트로 데이터를 전송하고 싶어했던 사용자를받은 후 사이트를 피싱 때, 피싱 사이트는 원하는 데이터에 대한 주요 정보를 일부 수정하여 이러한 정보를 설정 한 다음 일반 사이트에 웹 사이트에 수정이 세트를 보내 처리.

이러한 피싱 사이트의 목적과 이익을 달성하기 위해 사용자 정보를 훔치는. 합법적 인 웹 사이트를 고통에 이것은 사용자를 가능하게 할 것이다.

이러한 상황을 방지하기 위해, 사이트의 공식적인 승인은 일부 데이터 처리를 할 수 있습니다. 이 웹 사이트의 규정은 자신의 요청이 페이지에서 제출 POST 처리됩니다.

이 보장하지만 사이트 간 요청에서 피싱 사이트의 실패는 나를 보내신 것을.

이는 중간 CSRF 이러한 조작에 사용된다. 이 미들웨어로 전면에 HTML 페이지를 보낼 때, 백 엔드, 이름 속성을 가진 폼 입력 상자의 형태로 첨가되며, 값은 사용자의 실제 계정 로그인하고, 다음 라벨을 숨 깁니다.

데이터의 제출시 사용자 그래서, 당신은이 경우이 숨겨진 태그가 백 엔드, 그것은 당신이 진짜 사용자임을 표시 여부를 확인할 수 있습니다. 그렇지 않은 경우는 다른 사이트로 전송 가짜 요청을 보여줍니다.

이것은 권리와 사용자의 이익의 목적을 위해 수행 할 수 있습니다.

미들웨어 CSRF의 방법 2.Django 사용

구성 파일의 중간 CSRF 쓰기가 완료되면, 미들웨어 코멘트를하지 않는 한, 그것은 자동으로 HTML 도움말은 프론트 엔드를 향해 후방 단, 추가 csrf_token을 파일을 전송합니다.

요구의 후단에 전단이 데이터를 전송하기 위해이 경우, 반송 csrf_token 파라미터 CSRF를 검사하여 상기 데이터의 후단의 끝을 확인할 필요가있다.

2.1 일반적인 형태의 양식 제출 자료

전면 csrf_token을 수행하는 방법 :

{# 你只需要在表单中写一个{% csrf_token %} #}
<form action="" method="post">
    {% csrf_token %}   
    {# csrf_token必须写在form表单里面 #}
    <p>username:<input type="text" name="username"></p>
    <p>target_account:<input type="text" name="target_user"></p>
    <p>money:<input type="text" name="money"></p>
    <input type="submit">
</form>

2.2 아약스는 데이터를 제출

방법 1 : 더 복잡하다

어떤 위치 {% csrf_token %}의 첫 번째 페이지를 작성;

임의의 문자열 인수를 보낼 때 다음 라벨 아약스 요청을 통해 보면, 객체에 추가 된 데이터는 사용자 정의 할 수 있습니다.

<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            // 第一种
            data:{
                'username':'jason',
                'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()
            },
            success:function (data) {
                alert(data)
            }
        })
    })
</script>

옵션 2 : 간단한

<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            // 第二种
            data:{
                'username':'jason',
                'csrfmiddlewaretoken':'{{ csrf_token }}'  {# 要加一下引号 #}
            },  {# 要加一下引号 #}
            success:function (data) {
                alert(data)
            }
        })
    })
</script>

모드 3 : 공식 웹 사이트 파일을 제공합니다 (방법의 가장 일반적인 종류)

새로운 파일을 직접 JS 코드를 도입 할 수 복사됩니다;

당신은 관련 코드를 작성 CSRF 중 하나를 수행 할 필요가 없습니다

당신은 관련 코드를 작성 CSRF 중 하나를 수행 할 필요가 없습니다

<script src="/static/setup.js"></script>
<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            // 第三种  利用脚本文件 啥也不用写
            data:{'username':'jason'},
            success:function (data) {
                alert(data)
            }
        })
    })
</script>

3.csrf 관련 장식

3.1 csrf_exempt

당신이 세계적인 미들웨어 체크 CSRF를 설정해야 할 경우, 장식 기능을 확인할 수 없습니다 수 있습니다.

# @csrf_exempt  # 不校验 csrf
def index(request):
    return HttpResponse('index')  # 不需要也可以交互

3.2 csrf_protect

CSRF 미들웨어 주석 경우, 기능 수없는 글로벌 패리티 CSRF 세트

@csrf_protect  # 校验
def login(request):
    return HttpResponse('login')

3.3 CBV의 기능에 위의 두 가지 기능을 사용하는 방법

  1. 이 장식에만 적용하려면 파견 장착 할 수 있습니다 csrf_exempt;
  2. 그들이 할 수있는 방법을 csrf_protect, 일반 장식 장식 CBV 일치.
# @method_decorator(csrf_exempt,name='post')  # csrf_exempt不支持该方法
@method_decorator(csrf_exempt,name='dispatch')  # 可以
class MyIndex(views.View):
    # @method_decorator(csrf_exempt)  # 可以
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)
    def get(self,request):
        return render(request,'transfer.html')
    # @method_decorator(csrf_exempt,name='post')  # csrf_exempt不支持该方法
    def post(self,request):
        return HttpResponse('OK')   

# @method_decorator(csrf_protect,name='post')  # 可以
class MyIndex(views.View):
    @method_decorator(csrf_protect)  # 可以
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)
    def get(self,request):
        return render(request,'transfer.html')
    # @method_decorator(csrf_protect)  # 可以
    def post(self,request):
        return HttpResponse('OK')

세, 장고 인증 관리

장고 인증 모듈이 내장되어 사용자 인증 모듈.

이 장고 로그인 인증에 도움을 주신 당신이 정말 너무 행복, 자신을 작성할 필요가 없습니다 많은 것들을!

사용자 데이터는 데이터 마이그레이션에 저장되어, 장고 자동 도움말 AUTH_USER 테이블 우리가 만들었습니다.

1. 인증 모듈의 일반적인 방법

1.1 사용자 만들기

인증을 시작하기 위해 사용자의 필요성을 만드는 데 사용할 django.contrib.auth.models가져 오기 user모듈 :

from django.contrib.auth.models import User

# 不可用  密码不是加密的
# User.objects.create(username=username,password=password)

# 创建普通用户    密码自动加密
User.objects.create_user(username=username,password=password) 

# 创建超级用户   需要邮箱数据  密码自动加密
User.objects.create_superuser(username=username,password=password,email='[email protected]')  


# 源码
def create_user(self, username, email=None, password=None, **extra_fields):
    extra_fields.setdefault('is_staff', False)
    extra_fields.setdefault('is_superuser', False)
    return self._create_user(username, email, password, **extra_fields)

def create_superuser(self, username, email, password, **extra_fields):
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)

1.2 검증 사용자 이름과 암호

정식 사용자 이름과 시작하는 데 필요한 암호 확인에 사용할 django.contrib가져 오기 auth모듈 :

from django.contrib import auth

user_obj = auth.authenticate(request,username=username,password=password)
# 必须传用户名和密码两个参数 缺一不可

사용자는 user_obj 반환 아무것도 찾을하지 않습니다.

1.3은 사용자의 로그인 상태를 저장합니다

사용하여 auth.login(request,user_obj)사용자의 로그인 상태, 자동으로 user_session 테이블에 기록을 저장합니다.

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(request,username=username,password=password)
        # print(user_obj)
        if user_obj:
            # print(user_obj)
            # print(type(user_obj))
            # 保存用户登录状态,在session表中保存用户
            # 相当于request.session['user'] = 'name'
            # 且只要执行了这一句话,
            # 之后你可以在任意位置通过request.user获取到当前登录用户对象
            auth.login(request,user_obj)
            return HttpResponse('登陆成功!')

    return render(request,'login.html')

1.4 결정 현재 사용자의 로그인 여부

사용 request.user.is_authenticated()이 부울 값, 참 / 거짓을 반환, 사용자가 로그인되어 있는지 여부를 결정합니다.

def check_login(request):
    if request.user.is_authenticated():
        return HttpResponse('login')
    else:
        return HttpResponse('not login')

1.5 원래 암호가 정확한지 확인

를 통해 request.user.check_password(旧密码)사용자가 올바른 암호를 입력 여부를 확인하기 위해, 그것은 거짓 부울 값 사실을 /를 반환합니다.

@login_required # 局部登录跳转页面配置
def check_password(request):
    user_obj = request.user  # 获取已经登陆的用户
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        # 校验原来的密码是否正确 返回布尔
        is_right = user_obj.check_password(old_password)
        if is_right:
            user_obj.set_password(new_password)
            user_obj.save()
        return HttpResponse('修改成功!')
    return render(request,'change_password.html')

1.6 암호 변경

하여 request.user.set_password(新密码)사용자의 암호를 수정하면 수정 완료 후 수행해야 request.user.save()데이터베이스에 수정 된 데이터에.

그렇지 않으면, 데이터 만 캐시에 약간의 수정, 정말 데이터베이스에 기록되지 않습니다.

@login_required # 局部登录跳转页面配置
def check_password(request):
    user_obj = request.user  # 获取已经登陆的用户
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        # 校验原来的密码是否正确 返回布尔
        is_right = user_obj.check_password(old_password)
        if is_right:
            # 修改用户密码,并保存
            user_obj.set_password(new_password)
            user_obj.save()
        return HttpResponse('修改成功!')
    return render(request,'change_password.html')

1.7 로그 아웃

직접 auth.logout(request)사용자 아웃 방법을 기록합니다.

@login_required
def logout(request):
    auth.logout(request)
    return HttpResponse('用户已注销!')

1.8 사용자 장식 기록되어 있는지 여부를 확인

1. 먼저 당신은 수입 로그인 인증 기능 장식 모듈에 필요

from django.contrib.auth.decorators import login_required

로그인하지 않은 경우 2. 그런 다음 URL 로그인 페이지로 이동을 설정할 수 있습니다

로컬 구성

@login_required(login_url='/login/')
def func(request):
    pass

글로벌 구성 (직접 구성하려면 설정 구성 파일)

# settings中配置
LOGIN_URL = '/login/'

# views
@login_required  
def func(request):
    pass

참고 :

글로벌 구성, 또한 로컬 구성, 지역화 될 것이다 경우 login_url우선.

테이블 AUTH_USER 2. 확장 필드

외래 키 관계를 구축하기 위해 2.1 사용을 하나 개의 테이블

다른 필드 매장에 테이블을 쓰기는 AUTH_USER 테이블에 바인딩 한 외래 키 관계를 추가합니다.

이전은 바인드해야합니다 from django.contrib.auth.models import User자동으로 만들어 온 테이블 가이드.

# models
from django.contrib.auth.models import User
class UserDetail(models.Model):
    phone = models.BigIntegerField()
    user = models.OneToOneField(to='User')

장고 의해 제공 2.2 인증 클래스 상속

이것은 당신이 모든 테이블을 작성하기 전에 auth_user와 직접 테이블을 수정해야한다.

부모 클래스 사용자 테이블이 자신의 새 사용자 클래스를 다시 상속하여.

사용자에 같은 부모의 요구 상속에 앞서 from django.contrib.auth.models import AbstractUser이상의 가이드.

# models
from django.contrib.auth.models import AbstractUser
class Userinfo(AbstractUser):
    phone = models.BigIntegerField()
    register_time = models.DateField(auto_now_add=True)

참고 :

자신의 클래스를 재 작성 후, 그렇지 않으면 시스템이 자신이 테이블을 재 작성 원하는 것을 모르는, 구성 파일을 구성해야합니다.

작성 후, 모든 인증 모듈 기능은 모든 새 책상으로 사용하기 전에.

# settings
AUTH_USER_MODEL = 'app01.Userinfo'  # 应用名.表名

추천

출처www.cnblogs.com/bowendown/p/12004040.html