欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-05 14:22:14
...

Django权限系统

#1 用户

User

from django.contrib.auth.models import User
...
class UserProfile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    ...

创建

User.objects.create_user(username="cox", password="cox123456")

AbstractUser

from django.contrib.auth.models import AbstractUser
...
class UserProfile(AbstractUser):
    age = models.CharField(max_length=16)
    ...

settings.py

AUTH_USER_MODEL = 'app名.UserProfile'

#2 认证用户

系统自带认证

from django.contrib.auth import authenticate
...
user = authenticate(username=username, password=password)
# 认证用户的密码是否有效, 若有效则返回代表该用户的user对象, 若无效则返回None
# 需要注意的是:该方法不检查 is_active 标志位

自定义认证

settings.py

AUTHENTICATION_BACKENDS = (
    'apps.User.utils.mycustombackend.custombackend.CustomBackend',
)

apps.User.utils.mycustombackend.custombackend.CustomBackend

from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from User import models


class CustomBackend(ModelBackend):
    """
    自定义用户验证规则,输入用户名/邮箱均可
    """
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = models.UserProfile.objects.get(Q(username=username)|Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            print("用户登录验证异常except:", e)
            return None

#3 修改用户密码

user.set_password(new_password)

#4 登录

from django.contrib.auth import login
...
login(request, user)
# 在auth/__init__.py中可以看到login的源代码

#5 退出登录

from django.contrib.auth import logout
...
logout(request)

#6 Group

from django.contrib.auth.models import Group

User对象中有一个名为groups的多对多字段, 多对多关系由auth_user_groups数据表维护。Group对象可以通过user_set反向查询用户组中的用户

添加/删除 用户组

group = Group.objects.create(name=group_name) # 添加权限组
group.save()
---
group = Group.objects.get(name=group_name) # 删除权限组
group.delete() 

用户加入用户组

user.groups.add(group)
或者
group.user_set.add(user)

用户退出用户组

user.groups.remove(group)
或者
group.user_set.remove(user)

用户退出所有用户组

user.groups.clear()

用户组中所有用户退出组

group.user_set.clear()

#7 Permission

检查用户权限

user.has_perm方法用于检查用户是否拥有操作某个模型的权限

user.has_perm('blog.add_article')
# 若拥有权限则返回True

用户

添加权限

user.user_permissions.add(permission)

删除权限

user.user_permissions.delete(permission)

清空权限

user.user_permissions.clear()

权限组

添加权限

group.permissions.add(permission)

删除权限

group.permissions.delete(permission)

清空权限

group.permissions.clear()

#8 自定义权限

class Discussion(models.Model):
  ...
  class Meta:
      permissions = (
          ("create_discussion", "Can create a discussion"),
          ("reply_discussion", "Can reply discussion"),
      )

判断用户是否拥有自定义权限:

user.has_perm('app名.create_discussion')