Django使用者認證系統(三)組與許可權

來源:互聯網
上載者:User
Django的許可權系統很簡單,它可以賦予users或groups中的users以許可權。

Django admin後台就使用了該許可權系統,不過也可以用到你自己的代碼中。

User對象具有兩個ManyToManyField欄位,groups和user_permissions

groups = models.ManyToManyField(Group, verbose_name=_('groups'),
blank=True, help_text=_('The groups this user belongs to. A user will '
'get all permissions granted to each of '
'their groups.'),
related_name="user_set", related_query_name="user")
user_permissions = models.ManyToManyField(Permission,
verbose_name=_('user permissions'), blank=True,
help_text=_('Specific permissions for this user.'),
related_name="user_set", related_query_name="user")

可以像其它的django Model一樣來訪問他們:

myuser.groups = [group_list]
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()
myuser.user_permissions = [permission_list]
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()

許可權Permissions

許可權是作為一個Model存在的,建立一個許可權就是建立一個Permission Model的執行個體。

@python_2_unicode_compatible
class Permission(models.Model):
"""
The permissions system PRovides a way to assign permissions to specific
users and groups of users.

The permission system is used by the Django admin site, but may also be
useful in your own code. The Django admin site uses permissions as follows:

- The "add" permission limits the user's ability to view the "add" form
and add an object.
- The "change" permission limits a user's ability to view the change
list, view the "change" form and change an object.
- The "delete" permission limits the ability to delete an object.

Permissions are set globally per type of object, not per specific object
instance. It is possible to say "Mary may change news stories," but it's
not currently possible to say "Mary may change news stories, but only the
ones she created herself" or "Mary may only change news stories that have a
certain status or publication date."

Three basic permissions -- add, change and delete -- are automatically
created for each Django model.
"""
name = models.CharField(_('name'), max_length=255)
content_type = models.ForeignKey(ContentType)
codename = models.CharField(_('codename'), max_length=100)
objects = PermissionManager()

class Meta:
verbose_name = _('permission')
verbose_name_plural = _('permissions')
unique_together = (('content_type', 'codename'),)
ordering = ('content_type__app_label', 'content_type__model',
'codename')

def __str__(self):
return "%s | %s | %s" % (
six.text_type(self.content_type.app_label),
six.text_type(self.content_type),
six.text_type(self.name))

def natural_key(self):
return (self.codename,) + self.content_type.natural_key()
natural_key.dependencies = ['contenttypes.contenttype']

欄位fields

name:必需。50個字元或更少,例如,’Can Vote‘

content_type:必需,一個對於django_content_type資料庫table的引用,table中含有每個應用中的Model的記錄。

codename:必需,100個字元或更少,例如,'can_vote'。

如果要為某個Model建立許可權:

from django.db import models

class Vote(models.Model):
...

class Meta:
permissions = (("can_vote", "Can Vote"),)

如果這個Model在應用foo中,則許可權表示為'foo.can_vote',檢查某個使用者是否具有許可權myuser.has_perm('foo.can_vote')

預設許可權default permissions

如果已經在 INSTALLED_APPS配置了django.contrib.auth,它會保證為installed applications中的每個Django Model建立3個預設許可權:add, change 和 delete。

這些許可權會在你第一次運行 manage.py migrate(1.7之前為syncdb) 時建立。當時所有的models都會建立許可權。在這之後建立的新models會在再次運行 manage.py migrate時建立這些預設許可權。這些許可權與admin管理介面中的建立,刪除,修改行為是一一對應的。

假設你有一個應用 foo ,其中有一個模型 Bar, 你可以用下述方法來測試基本許可權:

add: user.has_perm('foo.add_bar')
change: user.has_perm('foo.change_bar')
delete: user.has_perm('foo.delete_bar')
許可權模型( Permission model)一般不直接使用。

組Groups

組也是作為Model存在的:

@python_2_unicode_compatible
class Group(models.Model):
"""
Groups are a generic way of categorizing users to apply permissions, or
some other label, to those users. A user can belong to any number of
groups.

A user in a group automatically has all the permissions granted to that
group. For example, if the group Site editors has the permission
can_edit_home_page, any user in that group will have that permission.

Beyond permissions, groups are a convenient way to categorize users to
apply some label, or extended functionality, to them. For example, you
could create a group 'Special users', and you could write code that would
do special things to those users -- such as giving them access to a
members-only portion of your site, or sending them members-only email
messages.
"""
name = models.CharField(_('name'), max_length=80, unique=True)
permissions = models.ManyToManyField(Permission,
verbose_name=_('permissions'), blank=True)

objects = GroupManager()

class Meta:
verbose_name = _('group')
verbose_name_plural = _('groups')

def __str__(self):
return self.name

def natural_key(self):
return (self.name,)

欄位fields:

name:必需,80個字元或更少,例如, 'Awesome Users'。

permissions:ManyToManyField to Permission

group.permissions = [permission_list]
group.permissions.add(permission, permission, ...)
group.permissions.remove(permission, permission, ...)
group.permissions.clear()

Programmatically creating permissions

除了可以使用Model meta來建立許可權,也可以直接用代碼建立。

例如,為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.objects.create(codename='can_publish',
name='Can Publish Posts',
content_type=content_type)

許可權可以被賦予一個User對象通過它的user_permissions屬性或者賦予一個Group通過它的permissions屬性。

許可權緩衝

User的許可權檢查時是可以被緩衝的,如果一個新許可權被賦予一個User,如果再立即檢查是不會被檢查出來的。最簡單的方法是重新fetch 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)
#許可權檢查會緩衝現在的許可權集
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)

# Permission cache is repopulated from the database
user.has_perm('myapp.change_bar') # True

...

許可權裝飾器

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

檢查使用者是否具有某個許可權,類似於@login_required()

from django.contrib.auth.decorators import permission_required

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

模板中的許可權

user的的許可權儲存在模板變數 {{ perms }}中,是django.contrib.auth.context_processors.PermWrapper執行個體。

{{ perms.foo }}

上面的單屬性是User.has_module_perms的代理。如果user擁有foo中的任一許可權,則為True

{{ perms.foo.can_vote }}

上面的兩級屬性查詢是User.has_perm的代理,如果使用者擁有foo.can_vote許可權則為True。

例如:

{% if perms.foo %}
<p>You have permission to do something in the foo app.</p>
{% if perms.foo.can_vote %}
<p>You can vote!</p>
{% endif %}
{% if perms.foo.can_drive %}
<p>You can drive!</p>
{% endif %}
{% else %}
<p>You don't have permission to do anything in the foo app.</p>
{% endif %}

或者:

{% if 'foo' in perms %}
{% if 'foo.can_vote' in perms %}
<p>In lookup works, too.</p>
{% endif %}

以上就是Django使用者認證系統(三)組與許可權的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.