Rumah pembangunan bahagian belakang Tutorial Python Django用户认证系统(三)组与权限

Django用户认证系统(三)组与权限

Dec 23, 2016 pm 05:42 PM

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 %}
   

You have permission to do something in the foo app.


   {% if perms.foo.can_vote %}
       

You can vote!


   {% endif %}
   {% if perms.foo.can_drive %}
       

You can drive!


   {% endif %}
{% else %}
   

You don't have permission to do anything in the foo app.


{% endif %}

或者:

{% if 'foo' in perms %}
   {% if 'foo.can_vote' in perms %}
       

In lookup works, too.


   {% endif %}

 以上就是Django用户认证系统(三)组与权限的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyemak versi django Bagaimana untuk menyemak versi django Dec 01, 2023 pm 02:25 PM

Langkah-langkah untuk menyemak versi Django: 1. Buka terminal atau tetingkap command prompt 2. Pastikan Django tidak dipasang, anda boleh menggunakan alat pengurusan pakej untuk memasangnya dan masukkan perintah pip install django; Selepas pemasangan selesai, anda boleh menggunakan python -m django --version untuk menyemak versi Django.

Django vs. Flask: Analisis perbandingan rangka kerja web Python Django vs. Flask: Analisis perbandingan rangka kerja web Python Jan 19, 2024 am 08:36 AM

Django dan Flask adalah kedua-duanya peneraju dalam rangka kerja Web Python, dan kedua-duanya mempunyai kelebihan dan senario yang boleh digunakan. Artikel ini akan menjalankan analisis perbandingan kedua-dua rangka kerja ini dan memberikan contoh kod khusus. Pengenalan Pembangunan Django ialah rangka kerja Web berciri penuh, tujuan utamanya adalah untuk membangunkan aplikasi Web yang kompleks dengan cepat. Django menyediakan banyak fungsi terbina dalam, seperti ORM (Pemetaan Hubungan Objek), borang, pengesahan, bahagian belakang pengurusan, dsb. Ciri-ciri ini membolehkan Django mengendalikan besar

Kebaikan dan Keburukan Rangka Kerja Django: Semua yang Anda Perlu Tahu Kebaikan dan Keburukan Rangka Kerja Django: Semua yang Anda Perlu Tahu Jan 19, 2024 am 09:09 AM

Django ialah rangka kerja pembangunan lengkap yang merangkumi semua aspek kitaran hayat pembangunan web. Pada masa ini, rangka kerja ini merupakan salah satu rangka kerja web yang paling popular di seluruh dunia. Jika anda bercadang untuk menggunakan Django untuk membina aplikasi web anda sendiri, maka anda perlu memahami kelebihan dan kekurangan rangka kerja Django. Berikut ialah semua yang anda perlu ketahui, termasuk contoh kod khusus. Kelebihan Django: 1. Pembangunan pesat-Djang boleh membangunkan aplikasi web dengan cepat. Ia menyediakan perpustakaan yang kaya dan dalaman

Bagaimana untuk menyemak versi django Bagaimana untuk menyemak versi django Nov 30, 2023 pm 03:08 PM

Cara menyemak versi django: 1. Untuk menyemak melalui baris arahan, masukkan arahan "python -m django --version" dalam terminal atau tetingkap baris arahan 2. Untuk menyemak dalam persekitaran interaktif Python, masukkan "import django print(django. get_version())" code; 3. Semak fail tetapan projek Django dan cari senarai bernama INSTALLED_APPS, yang mengandungi maklumat aplikasi yang dipasang.

Apakah perbezaan antara versi django? Apakah perbezaan antara versi django? Nov 20, 2023 pm 04:33 PM

Perbezaannya ialah: 1. Siri Django 1.x: Ini ialah versi awal Django, termasuk versi 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8 dan 1.9. Versi ini menyediakan fungsi pembangunan web asas; 2. Siri Django 2.x: Ini adalah versi jangka pertengahan Django, termasuk versi 2.0, 2.1, 2.2 dan lain-lain siri Django Termasuk versi 3.0, 3, dsb.

Cara menaik taraf versi Django: langkah dan pertimbangan Cara menaik taraf versi Django: langkah dan pertimbangan Jan 19, 2024 am 10:16 AM

Cara menaik taraf versi Django: langkah dan pertimbangan, contoh kod khusus diperlukan Pengenalan: Django ialah rangka kerja Web Python yang berkuasa yang sentiasa dikemas kini dan dinaik taraf untuk memberikan prestasi yang lebih baik dan lebih banyak ciri. Walau bagaimanapun, bagi pembangun yang menggunakan versi lama Django, menaik taraf Django mungkin menghadapi beberapa cabaran. Artikel ini akan memperkenalkan langkah dan langkah berjaga-jaga tentang cara untuk meningkatkan versi Django dan memberikan contoh kod khusus. 1. Sandarkan fail projek sebelum menaik taraf Djan

Adakah django bahagian hadapan atau belakang? Adakah django bahagian hadapan atau belakang? Nov 21, 2023 pm 02:36 PM

Django ialah bahagian belakang. Butiran: Walaupun Django terutamanya rangka kerja bahagian belakang, ia berkait rapat dengan pembangunan bahagian hadapan. Melalui ciri seperti enjin templat Django, pengurusan fail statik dan API RESTful, pembangun bahagian hadapan boleh bekerjasama dengan pembangun bahagian belakang untuk membina aplikasi web yang berkuasa dan boleh skala.

Django, Flask dan FastAPI: Rangka kerja manakah yang sesuai untuk pemula? Django, Flask dan FastAPI: Rangka kerja manakah yang sesuai untuk pemula? Sep 27, 2023 pm 09:06 PM

Django, Flask dan FastAPI: Rangka kerja manakah yang sesuai untuk pemula? Pengenalan: Dalam bidang pembangunan aplikasi web, terdapat banyak rangka kerja Python yang sangat baik untuk dipilih. Artikel ini akan menumpukan pada tiga rangka kerja yang paling popular, Django, Flask dan FastAPI. Kami akan menilai ciri mereka dan membincangkan rangka kerja yang terbaik untuk digunakan oleh pemula. Pada masa yang sama, kami juga akan menyediakan beberapa contoh kod khusus untuk membantu pemula lebih memahami rangka kerja ini. 1. Django: Django

See all articles