まず、後端部
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 = ' ユーザーマネージャ"
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と'、地元の人々を())
4.ホワイトリストとフリー認定のリスト
#ホワイトリスト:、あなたがパスにアクセスすることができ、ログインせず = WHITE_LIST [ R ' /ログイン/ ' 、 R ' ^ / ADMIN / ' 、 ] #のURLアクセスできるユーザログイン後に認証なしのリストを PUBLIC_LISTを= [ rは" /インデックス/ " 、 ]
ミドルウェアから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(' 許可を得ずに、管理者に連絡してください!')
第二に、前端部
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
<DIV クラス = " 静的メニュー" > {%ためのメニューで menu_list%} <a href= "{{ menu.url}}" クラス = "{{menu.class}}"> {{}} menu.title </a>の {%ENDFOR%} </ div>
カスタムタグの7応用
... <DIV クラス = " 左メニュー" > <DIV クラス = " メニュー体" > {%負荷my_tags%} {%メニュー要求%} </ div> ...