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

转载 2015年07月08日 09:57:29

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

django认证系统实现自定义权限管理

本文记录使用django自带的认证系统实现自定义的权限管理系统,包含组权限、用户权限等实现。0x01. django认证系统django自带的认证系统能够很好的实现如登录、登出、创建用户、创建超级用户...
  • le31ei
  • le31ei
  • 2017年01月17日 13:26
  • 5182

Django登录权限的认证

在有些情况下需要登录才可以访问,否则跳转到登录按钮,此文正是解决这个问题。 1.首先在utils文件夹中创建一个mixin_utils.py from django.contrib.aut...
  • qq_16260961
  • qq_16260961
  • 2017年06月10日 21:02
  • 224

Django 用户 权限 组 机制

Django 权限机制的实现http://www.open-open.com/lib/view/open1434595117223.html
  • ndjk454164628
  • ndjk454164628
  • 2016年06月23日 14:54
  • 362

[django]总结Django中的用户权限模块

此文是总结Django官方网站里面的Document的文章 User authentication in Django http://www.djangoproject.com/documentat...
  • zeng_84_long
  • zeng_84_long
  • 2012年11月06日 17:42
  • 4523

Django使用自己的用户系统,自定义用户系统

用过django的人应该都会知道admin,不过,需求是多变的,比如,你有一个变态的用户系统,用户可能有大中小三张头像,除了fisrt name ,last name外还有middle name,T^...
  • fighter_yy
  • fighter_yy
  • 2014年11月22日 16:27
  • 6425

django中的用户认证

本文主要介绍django的用户创建、授权,以及token等。创建用户使用django-admin命令创建工程时,默认创建了django的用户管理信息。 命令行下:$ python manage.py...
  • lanyang123456
  • lanyang123456
  • 2017年08月12日 17:32
  • 740

07.Django中的自定义认证方式和权限的设计与使用

django 自定义认证方式和权限的设计应用
  • Gamer_gyt
  • Gamer_gyt
  • 2016年03月31日 13:02
  • 3873

Django 权限认证 编写 -- 根据不同的用户,设置不同的显示和访问权限

Django 权限认证 编写 -- 根据不同的用户,设置不同的显示和访问权限
  • hahei2020
  • hahei2020
  • 2017年11月02日 18:31
  • 650

总结Django中的用户权限模块

此文是总结Django官方网站里面的Document的文章 User authentication in Django http://www.djangoproject.com/documentat...
  • onlyanyz
  • onlyanyz
  • 2015年07月08日 16:53
  • 3408

django 错误1

SystemCheckError: System check identified some issues: ERRORS: auth.User.groups: (fields.E304)...
  • shaququ
  • shaququ
  • 2017年02月11日 10:10
  • 1159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Django用户认证系统(三)组与权限
举报原因:
原因补充:

(最多只允许输入30个字)