DRF-認証認定
##ソースコード解析 `` `Pythonの " "" dispath(自己、要求、*引数の1)APIView 、** kwargsから) 2以内)dispathメソッドself.initial(要求、* argsを、** kwargsから) 最大の認定に #認証コンポーネント:ユーザーを確認する-観光客、違法ユーザーの正当なユーザー #ゲスト:チェックの代表者は、次のチェック(アクセス権を確認してください)に直接渡される #正当なユーザー:ユーザーによる検証の代わりにはからrequest.userに保存されていますし、次のチェックを(権限を確認)を入力し 、例外がスローされ、失敗したチェックを代表して403の権限異常な結果を返す:#権限のないユーザー self.perform_authentication(リクエスト) #特権コンポーネントを:ユーザ権限のチェック-サインインする必要があり、すべてのユーザーは、読み取り専用の訪問者、カスタムユーザーロール読み書きするためにログイン あなたは次のチェック(周波数認証)を入力することができます。#認証を 、例外がスローされた403の権限の異常な結果を返す:#認証失敗を self.check_permissions(リクエスト) #周波数成分を: (S、M、H)、時間(3 / s)の周波数の周波数サイクル時間を制限する条件(IP、ID、固有キー) -インタフェースのビューをアクセスする周波数の数を制限し 、通常の訪問を#制限時間に達していないと インタフェース #が制限時間に達し:制限時間にアクセスすることはできません、に到達する時間制限を再訪することができます self.check_throttles(リクエスト) 。3)認証部 Requestクラスは、認証完了)(ユーザー=> self._authenticateのプロパティメソッドを取得します :認証の詳細 #行う認証 DEFの_authenticate(セルフ): #は1つのオーセンティケータを得るために横断認証を行なう 房フィギュレーション#1 self.authenticatorsを生成されたリストからなる認証認証クラスのオブジェクトクラス :self.authenticatorsでの認証のための 試みを: #1オーソライザ(オブジェクト)は、認証方式の認証(認定クラスオブジェクト自身が、要求されたオブジェクトを要求)を呼び出し #戻り値:ユーザーのログイン情報認証付きなるタプル 例外がスローされます方法に代わって、試してラップされている#、例外は、認証の失敗を表し user_auth_tuple = authenticator.authenticate(自己) exceptions.APIException除い: self._not_authenticated() レイズ プロセス#戻り値を :なしませんuser_auth_tupleは、IF IS self._authenticator =認証の 値を返すためにどのように#、それはログインし、ログイン認証しますからrequest.user、request.authに保存されている self.user、self.auth = user_auth_tuple 戻り 戻り値がuser_auth_tupleがある場合#認証されたのに代わって、空が、観光客に代わって、ユーザのログイン認証情報でログインしていません )self._not_authenticated( 4)権利コンポーネント self.check_permissions(リクエスト) :認証ルール DEFのcheck_permissions(セルフ、要求): #オブジェクトトラバース権限の一覧を取得します権利オブジェクト(権限)、認証局 :()self.get_permissionsで許可のための 認証機関のために使用さ#許可クラスが許可has_permission方法を持っている必要があり、 権利は、自己オブジェクト、リクエストオブジェクト:#パラメータをリクエスト、ビュークラスオブジェクト #戻り値:Trueを返しする権限を持って、何の権威はFalseを返しません :IF(要求、セルフ)permission.has_permissionない self.permission_denied( リクエスト、メッセージ= GETATTR(許可、 'メッセージ'、なし) ) "" " ` `` ####カスタム認証クラス `` `Pythonのを "」 " 1)継承BaseAuthentication認証クラスの作成 2)実施認証方法 3)実装は、その認証ルールの観光客、不正ユーザ、許可されたユーザに応じて決定される グローバルまたはローカルに設定4) 認証規則を iは、NO認証情報は、なし(観光客)が返されていない II。そこに認証情報が(違法ユーザー)例外をスロー失敗 IIIは、ユーザ認証情報と認証情報タプル(正当な利用者)に正常に戻ってきた 「"」 ` `` #の#### utilsパッケージ/ authentications.py `` `Pythonの #カスタム認証クラス #1)BaseAuthenticationクラス継承 #を 無認証の観光客は、Noneを返します2)再認証(自己、リクエスト)メソッド、カスタム認証ルール #3)認定のルール・ベースの条件: # 何の認証情報なし(訪問者)を返しません #の 例外(不正ユーザ)投げて失敗した認証情報の認証を # 認証情報があるが正常にユーザ認証情報タプル(正規ユーザ)に戻す #4)完全なグローバルビュークラス(設定ファイル)または部分(正確なビュークラス)構成 から rest_framework.authentication インポートBaseAuthentication から rest_framework.exceptions インポートAuthenticationFailed から。インポートモデル クラスMyAuthentication(BaseAuthentication): 「」 " フロントデスクでの認証情報のリクエストヘッダの認証を取得するためには、(認証フィールドが一致して受信を得るために) 認証チェックサムがある 不具合を不正ユーザで、例外がスローされます 成功は、正当なユーザ、リターン(ユーザ認証情報)である 「」 " DEF 認証(自己、要求): #1 要求ヘッダ内の認証情報を搬送する前景 # 及び認可フィールドのデフォルト仕様は、認証情報を運ぶ #の 背景が要求オブジェクト内に固定しますMETAフィールドHTTP_AUTHORIZATION GET AUTH = request.META.get(' HTTP_AUTHORIZATION ' 、なし) #の処理観光客 IF認証IS なし: 返すなし #の小さなフィールドの認証ルールについてのセットを(二段): "認証認証文字列" auth_list = auth.split() #チェック合法または違法なユーザ IF ない(LEN(auth_list)== 2 とauth_list [0] .lower()==「AUTH 」): レイズ AuthenticationFailed(「認証情報が間違って、不正ユーザー」) #正規ユーザがauth_listから解決する必要がある[1]に #1 注:ケースを想定し、情報abc.123.xyz、缶管理ユーザーを解析し、実際の開発を、ロジックは、ユーザーの通常のロジックをチェックしなければならない のIF auth_listの= [1]!「abc.123.xyz 」: #のチェックが失敗した 昇給 AuthenticationFailed(「ユーザ認証が失敗し、不正ユーザを」) ユーザー = models.User.objects.filter(ユーザ名= ' ADMIN ' )1次回() IF ないユーザー: 昇給 AuthenticationFailed(「ユーザー・データが不正、不正ユーザである」) リターン)(ユーザー、なし `` ` ` `` Pythonの #の宿題 #models.User.objects.create_user():1)平均的なユーザーの認証に基づいてスクリプトを作成するために使用することができる3つの要素 #1 注:良好直接書き込みレジスタインタフェース #2)カスタムセッションテーブル:ID、U_ID、トークン、ユーザごとに固定された個人認証文字列の設定が直接データベース操作することができ #1 注:良好で実装インタフェースを登録します #3)カスタム認証クラス、異なるトークンは異なるログインチェックアウトすることができます `` ` #のような###システム権限 ` `` Pythonのを "「」 :1)AllowAny 認定は、すべてがTrue返さルール:Trueを返し 観光客をし、ログインしているすべてのユーザーがアクセス権を持っている 2)にisAuthenticated: 3)IsAdminUserを: リターンブール値(からrequest.userとrequest.user.is_authenticated):認証ルールは、有効なユーザーログインを持つ必要があります 訪問者が権利を持っていない、特権ユーザーが着弾した 認証ルールは、管理者ユーザーでなければなりません:リターンブール値(からrequest.userとrequest.user.is_staff) 訪問者が権利を持っていない、特権ユーザーが着弾した 4)IsAuthenticatedOrReadOnly 認証ルールを読み取り専用にする必要があります要求または正当なユーザー: リターンBOOL( SAFE_METHODSかでrequest.method からrequest.userと request.user.is_authenticated ) 訪問者が唯一の正当なユーザーを読んで無制限 「」 " #のAPI / views.py から rest_framework.permissions インポートにisAuthenticatedの クラスTestAuthenticatedAPIView (APIView): permission_classes = [にisAuthenticated] DEF(セルフ、リクエストをGET、引数*、** kwargsからの): 戻り(0、APIResponse ' OKインタフェースにアクセスするためにテストログイン' ) 位既定のアクセス許可クラスグローバル構成はAllowAnyのあるので #settings.py REST_FRAMEWORK = { #の許可クラスコンフィギュレーション ' DEFAULT_PERMISSION_CLASSES ' :[ ' rest_framework.permissions.AllowAny ' 、 ] 、 } `` ` ####カスタム許可クラス `のPython 「」 " 。1)BasePermissionが許可クラス継承作成 2)has_permission実施される方法 )3体が許可権ルールに従ってかどうかを決定するために実装 4)グローバルまたはローカル設定 の認証ルールを 私は、当局の代表は、Trueを返し、ユーザーが設定した条件を満たしています II。、ユーザーが設定した条件を満たす機関の代表者、Falseを返していません " "" ` `` `` `Pythonの #Utilsの/ permissions.py から rest_framework.permissionsはインポートBasePermissionを から django.contrib.auth.models インポートグループ クラス:MyPermission(BasePermission) DEFのhas_permission(セルフ、リクエスト、ビュー): #は、読み取り専用のインタフェースが分析 R1 = request.methodをして(' GET '、' HEAD '、' OPTIONS ' ) #の特権パケットとしてグループ グループGroup.objects.filter =(名前= ' 管理者' )1次回() #のすべての現在のユーザーのグループパケットが属する グループ= request.user.groups.all() R2 =グループとグループ R3 =グループにグループ #インターフェイスの誰もが、読んでユーザーインターフェイスがパケットの着陸で指定する必要があります書き込み権限がある リターン R1 または(R2 とR3) #の観光客が読み取り専用、読み取り専用ユーザのログインを、唯一のログオンユーザーだけ追加および削除することができ、管理者グループに属している から utilsの。アクセス権のインポートMyPermission クラスTestAdminOrReadOnlyAPIView(APIView): permission_classes =[MyPermission] #すべてのユーザがアクセスできる DEFの(セルフ、要求、* argsを、**をGETkwargsから): リターン APIResponse(0、' カスタムOKを読ん' ) #は、下のカスタム"管理者"ユーザーのパケットでなければなりません DEF POST(自己、要求、* argsを、** kwargsから): リターン APIResponse(0、" からOKの定義を書きます" ) ` ``