四、python Django Auth系统[用户管理、管理员权限分配、更改默认user表]

一、user表结构更改

前提:必须注意,必须是第一次新建user表才行,也就是说第一次使用python3 manage.py makemigrations命令才行,因此目标数据库也是空的

  1. setting中设置:AUTH_USER_MODEL = 'hello.dingtalk' #项目名.model名

  2. 解释:继承AbstractUser类可以增加user表字段last_login = None可以不继承其默认属性,上面的操作可以影响默认django自带的方法(因为有些字段变更

    from django.contrib.auth.models import AbstractUser
    # Create your models here.
    
    class dingtalk(AbstractUser):
        # username email is_active date_joined
        userid = models.CharField(unique=True,max_length=30)
        unionid= models.CharField(unique=True,max_length=50) # 企业员工唯一标识
        mobile=models.CharField(max_length=30) # 应用开启电话的个人权限时,钉钉才会返回
        job_number = models.CharField(max_length=30) # 工号
        title=models.CharField(max_length=20) # 职位
        email=models.EmailField() # 应用开启邮箱的个人权限时,钉钉才会返回
        senior=models.BooleanField() # 企业高管
        admin=models.BooleanField() # 企业管理员
        boss=models.BooleanField() # 企业老板
        last_login = None
        is_superuser=None
        is_staff=None
        password = None
        first_name=None
        last_name=None
    

二、Auth用户系统

1.注册用户

from django.contrib.auth.models import User
User.objects.create_user(email='1.@qq.com',username='luck',password='123456') 

2.用户登录

参数:

  1. authenticate:来判断用户账号密码是否正确,正确返回该用户对象可供操作
  2. login:登录成功开始分发session

重点:是否记住-即cookie的保存时间,设置SESSION_COOKIE_AGE = 86400# 秒 这里写的是一天默认是二周,views里面设置request.session.set_expiry(0) # 关闭浏览器就消失cookie

from django.contrib.auth import authenticate, login
def loginView(request):
    if request.method == 'POST':
        user = request.POST['user']
        password= request.POST['password']
        # 验证用户账号和密码
        auth = authenticate(username=user,password=password)
        # 判断账号密码是否正确
        if auth:
            # 验证用户是否注销,没有注销可继续使用
            if auth.is_active:
                login(request,auth)
                request.session.set_expiry(0) # 关闭浏览器cookie消失,登录凭证消失
                return HttpResponse("login ok")
        return HttpResponse('passwd fail')
    else:
        return render(request,'testWeb/login.html')

3.退出登录

from django.contrib.auth import logout
def logoutView(request):
    logout(request)
    return HttpResponse("ok")

4.修改密码

from django.contrib.auth.models import User      
User.objects.get(username='jack').set_password('gh1023803643') 

三、Auth管理员权限系统

解释:当完整安装了admin和auth的app时,数据库里面会产生关键的七个表,其中有4个是基础表,3个是多对多表

基础表:

  1. auth_user:用户表
  2. auth_group:分组表(可以给组赋予权力,这样该组下面的所以人都拥有该组的权力)
  3. auth_permission:权限表(里面写着权限,具体表现为一张表里面有4个权限,分别是增删改查,该表内容多少=表数*4)
  4. django_content_type:类型表(里面写着app对应的model对象)

多对多表:

  1. auth_group_permissions:组和权限互相关联
  2. auth_user_groups:用户和组互相关联
  3. auth_user_user_permissions:用户和权限互相关联

1.组管理

from django.contrib.auth.models import Group
from django.contrib.auth.models import User
# 创建组
Group.objects.create(name='name')

# 用户进组
group=Group.objects.get(name='name') 
user = User.objects.get(id=2) 
user.groups.add(group) 

# 用户退组
group=Group.objects.get(name='name') 
user = User.objects.get(id=2) 
user.groups.remove(group)

#用户退出所有用户组
user = User.objects.get(id=2) 
user.groups.clear()

#清空组中用户
group=Group.objects.get(name='name') 
group.user_set.clear()

2.权限管理

2.1 用户权限增删改

# 添加权限
user = User.objects.get(id=2) # 获取user用户
model = ContentType.objects.get(app_label='testWeb',model='father') # 从django_content_type表里面获取指定app和其模型所对应的id(因为django_permission的外键关联此表)
permission = Permission.objects.filter(content_type_id=model.id)[0] # 通过外键获取,这个外键会有4个相同的内容,分别为增加、修改、删除和查看
user.user_permissions.add(permission.id) # 通过多对多表给用户添加上权限,这个填的是外键字段(id)

# 删除
user.user_permissions.remove(permission.id)

# 清空权限
user.user_permissions.clear()

2.2 组权限增删改

# 添加权限
group = Group.objects.get(id=2)
		# 中间步骤和前面一样
group.permissions.add(permission.id)

# 删除
group.permissions.remove(permission.id)

# 清空权限
group.permissions.clear()

2.3 用户与组权限

# 获取用户所属组的权限
user.get_group_permissions()

# 获取用户本身的权限
user.get_user_permissions()

# 获取用户本身和所在组的权限
user.get_all_permissions()

2.4权限检查

user = User.objects.get(id=2) 
user.has_perm('testWeb.add_son') #testWeb是app名字,add是权限名字,son是模型名小写
user.has_perms([]) # 与上面不同就是传入一个列表
user.has_module_perms("app") # 查看是否对app有全部权限
# 有权限返回True
# 没有权限返回False

2.5自定义权限

官方文档


版权声明:本文为weixin_46765649原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。