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)
...
AUTH_USER_MODEL = 'app名.UserProfile'
#2 认证用户
系统自带认证
from django.contrib.auth import authenticate
...
user = authenticate(username=username, password=password)
# 认证用户的密码是否有效, 若有效则返回代表该用户的user对象, 若无效则返回None
# 需要注意的是:该方法不检查 is_active 标志位
自定义认证
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')
上一篇: Android 中的危险权限