ホームページ  >  記事  >  バックエンド開発  >  Django ユーザー認証システム (3) グループと権限

Django ユーザー認証システム (3) グループと権限

黄舟
黄舟オリジナル
2016-12-23 17:42:551327ブラウズ

Django の権限システムは非常にシンプルで、ユーザーまたはグループ内のユーザーに権限を付与できます。

Django 管理バックエンドはこの権限システムを使用しますが、独自のコードでも使用できます。ユーザーは「

」の各グループに付与されるすべての権限を取得します。 Ermissions = Models.manytomanyField (Permission,

Verbose_name = _ ('ユーザー権限'),blank=True,

help_text=_('これに対する特定の権限user.'),

relationship_name="user_set", relationship_query_name="user")


他の django モデルと同様にアクセスできます:

myuser.groups = [group_list]
myuser.groups.add(group, group, ...)
myuser.groups.remove(グループ, グループ, ...)
myuser.groups.clear()
myuser.user_permissions = [permission_list]

myuser.user_permissions.add(許可, 許可, ...)

myuser.user_permissions.remove(permission, Permission, ...)

myuser.user_permissions.clear()



Permissions

権限を確立するには、権限モデルのインスタンスを作成します。

@python_2_unicode_compatibility
class Permission(models.Model):
"""

権限システムは、特定の

ユーザーおよびユーザーのグループに権限を割り当てる方法を提供します。

権限システムは、Django 管理サイトによって使用されますですが、独自のコードでも役立つ可能性があります

。Django 管理サイトでは、次のようなアクセス許可が使用されます。


- 「追加」アクセス許可は、ユーザーが「追加」フォームを表示したり、オブジェクトを追加したりする機能を制限します。
- 「 「変更」権限は、変更
リストの表示、「変更」フォームの表示、オブジェクトの変更を行うユーザーの機能を制限します。
- 「削除」権限は、オブジェクトを削除する機能を制限します。

権限はオブジェクトの種類ごとにグローバルに設定されます。特定のオブジェクト
インスタンスごとではなく、「メアリーはニュース記事を変更するかもしれない」と言うのは可能ですが、「メアリーはニュース記事を変更するかもしれないが、彼女が自分で作成した
ものだけを変更するかもしれない」または「メアリーはニュース記事のみを変更するかもしれない」と言うのは
現時点では不可能です。
特定のステータスまたは公開日を持つニュース記事を変更します。"

3 つの基本的な権限 (追加、変更、削除) が、Django モデルごとに自動的に
作成されます。
"""
name = models.CharField(_( 'name '), max_length=255)
content_type = models.ForeignKey(ContentType)
コードネーム = models.CharField(_('codename'), max_length=100)
オブジェクト = PermissionManager()

class Meta:
verbose_name = _( '許可')
冗長名複数 = _('許可')
unique_together = (('content_type', 'codename'),)
順序付け = ('content_type__app_label', 'content_type__model',
'codename')

def __str__(self):
through ’ s ’ through ’s ’s ’ s ‐‐‐‐ out to 6.text_type(self.content_type),
)

def Natural_key(self):
return (self.コードネーム、) + self.content_type.natural_key()
Natural_key.dependency = ['contenttypes.contenttype']


fields フィールド

name: 必須。 50 文字以下、例: 「Can Vote」

content_type: 必須。アプリケーション内の各モデルのレコードが含まれる django_content_type データベース テーブルへの参照。

コード名: 必須、100 文字以下、例: 「can_vote」。

モデルの権限を作成したい場合:

from django.db import models

class Vote(models.Model):
...

class Meta:
Permissions = (("can_vote", "Can投票 "),)

このモデルがアプリケーション foo にある場合、権限は 'foo.can_vote' として表現され、ユーザーが権限 myuser.has_perm('foo.can_vote') を持っているかどうかを確認します

デフォルトの権限

django.contrib.auth は INSTALLED_APPS で構成されており、インストールされているアプリケーションの Django モデルごとに 3 つのデフォルトのアクセス許可 (追加、変更、削除) が確実に作成されます。

これらの権限は、manage.py merge を初めて実行するときに作成されます (1.7 より前の syncdb)。その時点で、すべてのモデルに権限が確立されます。これ以降に作成される新しいモデルには、manage.py merge が再度実行されるときに作成されるこれらのデフォルトのアクセス許可が設定されます。これらの権限は、管理管理インターフェイスでの作成、削除、および変更の動作に対応します。

モデル Bar を持つアプリケーション foo があると仮定すると、次のメソッドを使用して基本的な権限をテストできます:

add: user.has_perm('foo.add_bar')
change: user.has_perm('foo.change_bar' )
delete: user.has_perm('foo.delete_bar')
Permissionモデル(Permissionモデル)は、通常、直接使用されません。

グループ

グループはモデルとしても存在します:

@python_2_unicode_compatibility
class Group(models.Model):
"""
グループは、ユーザーを分類して権限や他のラベルをユーザーに適用する一般的な方法です。ユーザーは、任意の数の
グループに所属できます。

グループ内のユーザーには、その
グループに付与されているすべての権限が自動的に付与されます。

グループは、権限を超えてユーザーを分類するのに便利な方法です。
いくつかのラベルや拡張機能をそれらに適用すると、
グループ「特別ユーザー」を作成し、それらのユーザーに特別な操作を
するコードを作成できます。サイトのメンバー限定部分、またはメンバー限定の電子メール
メッセージを送信します。
"""
name = models.CharField(_ ('name'), max_length=80, unique=True)
権限 = models.ManyToManyField (許可,
)verbose_name=_('permissions'),blank=True)

オブジェクト = GroupManager()

class Meta:
Verbose_name = _ ('グループ')
Verbose_name_plural = _ ('グループ')

DEF __Str __ (Self):
Return Self.name

Def Nature_key (Sel):
Return (SELN f.Name,) フェーズフィールドフィールド:

name: 必須、80 文字以下、例: 'Awesome Users' 。

permissions:ManyToManyFieldからPermissionへ

group.permissions = [permission_list]

group.permissions.add(permission, 許可, ...)

group.permissions.remove(permission, 許可, ...)

group.permissions .clear()

プログラムによる権限の作成

モデルメタを使用して権限を作成することに加えて、コードを使用して直接作成することもできます。

たとえば、myapp アプリケーションで BlogPost モデルの can_publish 権限を作成します。

from myapp.models import BlogPost

from django.contrib.auth.models import Group, Permission

from django.contrib.contenttypes.models import ContentType content_type = contentType.objects.get_for_model(blogpost)

permission= permission.objeds.create(codename = 'can_publish'、

name = 'can publise "、

content_type = content_type) user_permissions 属性を使用してユーザー オブジェクトを指定するか、permission 属性を使用してグループに割り当てます。


権限のキャッシュ

ユーザーに新しい権限が与えられた場合、すぐにチェックすると、ユーザーの権限はキャッシュされません。最も簡単な方法は、User オブジェクトを再フェッチすることです。

from django.contrib.auth.models import Permission, User
from django.shortcuts import get_object_or_404

def user_gains_perms(request, user_id):
user = get_object_or_404(User, pk=user_id)
#Permission チェックは現在の権限をキャッシュしますSet
user.has_perm('myapp.change_bar')

Permission = Permission.objects.get(codename='change_bar')
user.user_permissions.add(permission)

# 権限キャッシュセットを確認します
user.has_perm(' myapp.change_bar') # False

# 新しいインスタンスをリクエストします
user = get_object_or_404(User, pk=user_id)

# 権限キャッシュはデータベースから再設定されます
user.has_perm('myapp.change_bar') # True

..

Permissiondecorator

permission_required(perm[,login_url=None, raise_Exception=False])

django.contrib.auth の @login_required()

と同様に、ユーザーが特定の権限を持っているかどうかを確認します。デコレータインポート許可_required

@permission_required('polls.can_vote',login_url='/loginpage/')
def my_view(request):
...

テンプレート内の権限

ユーザーの権限はテンプレート変数に保存されます{ { perms }} は django.contrib.auth.context_processors.PermWrapper インスタンスです。

{{ perms.foo }}

上記の 1 つの属性は User.has_module_perms のプロキシです。ユーザーが foo で何らかの権限を持っている場合、それは True

{{ perms.foo.can_vote }}

ユーザーが foo.can_vote 権限を持っている場合、上記の 2 レベルの属性クエリは User.has_perm のプロキシになります。 、 それは本当です 。

例:

{% if perms.foo %}
で何かをする権限があります。 else %}

foo アプリで何もする権限がありません。 </P> PHP 中国語 Web サイト (www.php.cn) に注意してください。




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。