役割ベースのアクセス制御のDjang(RBAC)

まず、後端部

1.モデルの設計

インプリメンテーション:特定の役割は、ユーザーアクセスを制御するために、特定のURLパスへのアクセス、ユーザーに関連付けられた役割を、持っています。

以下のような:管理者:URLアドレス、準一般の利用者Bのデータだけを表示するためのアクセス権を持っている(ページ1を参照してください):URLアドレスのすべてにアクセスでき、準管理者の鎧、鎧は全てのURLアドレス、平均的なユーザーへのアクセス権を持っています、Bは、通常のユーザー権限を持つことになります

2.models達成

クラスのパーミッション(models.Model):
    URL = models.CharField(max_lengthを= 64、verbose_name = ' 权限' 
    タイトル = models.CharField(max_lengthを= 32、verbose_name = ' 标题' 

    デフ __str__ (自己):
         戻りself.title 

    クラスメタ:
        verbose_name_plural = ' 权限管理' 


クラスの役割(models.Model):
    名前 = models.CharField(MAX_LENGTH = 32、verbose_name = ' 角色' 
    パーミッション= models.ManyToManyField(許可、verbose_name = ' 角色拥有的权限'、空白= 真)

    デフ __str__ (自己):
         戻りself.nameの

    クラスのMeta:
        verbose_name_plural = ' 角色管理' 


クラスのユーザー(models.Model):
    ユーザ名 =モデル.CharField(MAX_LENGTH = 32、verbose_name = ' 用户名'、ユニーク= 真)
    パスワード = models.CharField(max_lengthを= 32、verbose_name = ' 密码' 
    の役割 = models.ManyToManyField(役割、verbose_name = "ユーザーの役割'空白= 真)

    DEF  __str__ (自己):
         戻りself.usernameの

    クラスメタ- :
        verbose_name_plural = ' ユーザーマネージャ"
models.py

3.ユーザーの権限(URLアドレス)の成功の着陸は、セッション中に書かれています

RBAC 輸入モデル
 から django.shortcutsはインポートリダイレクト、レンダリング、のHttpResponseを
 から django.confのインポート設定

デフログイン(リクエスト):
     もし request.method == ' POST ' 
        ユーザ名 = request.POST.get(' ユーザ名' 
        パスワード = request.POST.get(' パスワード' 
        、OBJ = models.User.objects.filter(ユーザ名=ユーザ名、パスワード= パスワード)1次回()
         の場合 ではありませんOBJ:
            エラー = ' ユーザー名またはパスワードが正しくありません' 
            を返すレンダリング(リクエスト、' login.htmlと' 、地元の人について()) 

        GET権限情報の 
        許可= obj.roles.all()フィルタ(permissions__url__isnull (=偽).valuesを。 ' permissions__url ' ' permissions__title ' 
                                                                          ).distinct() 

        ログオンしているユーザーのアクセス権の取得リスト(アクセスできるURLアドレス) 
        ますrequest.session [ ' 許可' ] =リスト(許可)
        ますrequest.session [ ' is_login ' ] = 1つの
         リターンリダイレクト(' インデックス' 

    のリターン(要求、レンダリング' login.htmlと'、地元の人々を())    
views.py

4.ホワイトリストとフリー認定のリスト

ホワイトリスト:、あなたがパスにアクセスすることができ、ログインせず 
= WHITE_LIST [ 
    R ' /ログイン/ ' 
    R ' ^ / ADMIN / ' 
] 

#のURLアクセスできるユーザログイン後に認証なしのリストを 
PUBLIC_LISTを= [ 
    rは" /インデックス/ " 
]
settings.py

ミドルウェアから5.許可権を取得する(URLアドレスリスト)ますrequest.session

django.utils.deprecation インポートMiddlewareMixin
 から django.conf のインポート設定
 から django.shortcuts インポートリダイレクト、HttpResponseに
 インポート日時

クラス:AuthMiddleware(MiddlewareMixin)
     DEF process一(セルフ、要求):
        URL = request.path_info   現在のページのURLアドレス
        ホワイトリスト:登録、ログインし、ADMIN 
        ための settings.WHITE_LIST: settings.pyファイルアドレスホワイトリストで構成されたWHITE_LIST 
            IFのre.match(I、URL):
                 リターン

        #のログイン認証
        = request.session.get is_login(' is_login ' IF is_login = 1! リターンリダイレクト(' ログイン' 

        #の後のアドレスログイン認証のないような、誰もがアクセス可能:背景ホーム
         I settings.PUBLIC_LIST:
             IF 再.match(I、URL):
                 リターン

        #のうちここでは、現在ログインしているユーザーのログイン機能における当社の権利のすべてのURL(アドレスリスト)がセッションに配置されていることを確認する権限と一致するように、現在のURLアドレス。
        = request.session.get許可(' 許可' のための I での許可:
             IFre.match(R&LT ' ^ {} $ ' .format(I [ ' URL ' ])、URL):
                 リターン
        リターンのHttpResponse(' 許可を得ずに、管理者に連絡してください!'
ミドルウェア/ rbac.py

第二に、前端部

6.カスタムテンプレートタグ、描画データ

注:テンプレートタグ格納ディレクトリtamplatetagsでなければなりません

- * -コーディング:UTF-8 - * - __author__ = "メープル" 
からジャンゴインポートテンプレート
 から django.conf のインポート設定の
 インポートを再
登録 = template.Library()
@ register.inclusion_tag(' menu_tag.html 'menu_tagこの機能は、.htmlのファイルは、ラベルの一部であるテンプレートでレンダリングされ
DEF MENU(要求):
     「」 " 
   現在のURLアドレスが一致することができるようにURLアドレスをmenu_listときにmenu_listし     
   たアドレスに一致するものを追加しますキーと値のペア{「クラス」:「アクティブ」} 
    「」 " 
    URL = 要請。
    PATH_INFOの#は、スタイルをアクティブにするために追加
    のためにI menu_list:
         IF re.match(F ' ^ {I [ "URL"]} $ ' 、URL):
            I [ ' クラス' ] = ' アクティブ' 
            BREAKの
    リターン { ' menu_list ' :menu_list} 

#1 menu_listデータ形式例えば:    [{ 'URL': '/顧客/一覧/'}、{ 'URL': '/顧客/追加/'}、] もし現在のURLアドレス:/顧客/リスト/ 
#は    menu_listではありますデータは次のようになります
。#    [{ 'URL': '/顧客/一覧/'、 "クラス": "アクティブ"}、{ 'URL': '/顧客/追加/'}、]
my_tags.py

デコレータでレンダリングされたファイルのラベルの内容をmy_tags

<DIV クラス = " 静的メニュー" > 
    {ためのメニュー menu_list%}
         <a href= "{{ menu.url}}"  クラス = "{{menu.class}}"> {{}} menu.title </a>の
    {%ENDFOR%}
 </ div>
menu_tag.html

カスタムタグの7応用

    ...
 <DIV クラス = " 左メニュー" > 
   <DIV クラス = " メニュー体" > 
        {%負荷my_tags%} 
        {%メニュー要求%}
 </ div> 
    ...    
トップテンプレートファイル

おすすめ

転載: www.cnblogs.com/kindvampire/p/12173525.html