ミドルウェア、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はじめと起源

クロスサイトリクエストフォージェリ:クロスサイトリクエストフォージェリ

いくつかのフィッシングサイトは、インタフェースのような通常のサイトで書かれており、データを提出するよう、ユーザーを誘導します。ユーザーを受信した後、フィッシングサイトが正規のサイトにデータを送信したいと考えていましたときに、フィッシングサイトは、彼らが望むデータへの重要な情報がいくつか変更してこれらの情報を設定し、定期的にサイトにウェブサイトへの変更のこのセットを送りました処理のため。

からの目的と利益を達成するために、ユーザー情報を盗むためにこのようなフィッシングサイト。これは苦しむ正規のWebサイトにユーザーを可能にします。

そのようなAの事態を防ぐために、サイトの正式な受け入れは、いくつかのデータ処理を行います。このウェブサイトの規定は、唯一のポストでこのページに提出し、自分の要求を扱います。

クロスサイトリクエストからフィッシングサイトの障害が送ってくれたことを、この保証します。

これは、中間CSRFこのような動作のために使用されます。このミドルウェアでは、フロントにHTMLページを送信する際に、バックエンドは、name属性を持つフォーム入力ボックス内のフォームに追加され、その値は、ユーザーの実際のアカウントのログインで、その後、ラベルを非表示にします。

データの提出時に、ユーザがそう、あなたがそこにある場合は、この隠されたタグを持っているバックエンドかどうかを確認することができ、それはあなたが実際のユーザーであることを示しています。そうでない場合、それは他のサイトに送信された偽の要求を示しています。

これは、ユーザーの権利と利益を目的とすることを確実にするために行うことができます。

どのように2.DjangoミドルウェアCSRFの使用

設定ファイル内の中間CSRFが書き込まれている場合には、ミドルウェアコメントしない限り、それは自動的にHTMLヘルプは、フロントエンドに向けて後端、追加csrf_tokenをファイル送信されます。

この場合、データを送信する必要の後端に前端は、CSRFをチェックすることにより、データの後端部の先端を搬送csrf_tokenパラメータを確認する必要があります。

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 AJAXは、データを提出します

方法1:より複雑です

任意の位置{%csrf_token%}の最初のページを書き込みます。

ランダムな文字列の取得を送信するときに、ラベルのAJAX要求に目を通す、オブジェクトに追加されたデータは、カスタムすることができます。

<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')

三、Djangoの認証管理

Djangoの認証モジュールが内蔵されているユーザ認証モジュール。

そこ私たちはあなたがあまりにも本当に幸せ、自分自身を記述する必要はありませんたくさんのことを行うのに役立つジャンゴログイン認証を!

ユーザーデータは、データ移行、我々が作成したDjangoの自動ヘルプ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

グローバルコンフィギュレーション(直接のconfigureの設定コンフィギュレーションファイル)

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

# views
@login_required  
def func(request):
    pass

注意:

もしグローバルコンフィギュレーション、そしてまたローカル設定、ローカライズされますlogin_url勝ちます。

表AUTH_USER 2.拡張フィールド

外部キー関係を確立するために、2.1の使用1台

AUTH_USERテーブルに結合した1つの外部キー関係で、追加する別のフィールドを格納するテーブルを作成します。

バインドする必要が前に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クラス継承

これは、すべてのテーブルを作成する前にAUTH_USERが直接テーブルを変更する必要があります。

親クラスのユーザーテーブルを継承することで、独自の新しい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
おすすめ