1.用户权限控制说明
在产品运营平台中,是需要对用户进行权限控制的。Django实现了用户权限的控制
- 消费者用户与公司内部运营用户使用一个用户数据库来存储
- 通过is_staff 来区分是运营用户还是消费者用户
- 对于运营用户通过is_superuser 来区分是运营平台的管理员还是运营平台的普通用户
- 对于运营平台的普通用户,通过权限、组和组外权限来控制这个用户在平台上可以操作的数据。
- 对于权限,Django会为每个数据库表提供增、删、改、查四种权限
- 用户最终的权限为 组权限 + 用户特有权限
1.权限表管理
在权限表中我们需要对权限表数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作
1.获取用户权限表列表数据
接口分析
请求方式: GET /meiduo_admin/permission/perms/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
{ "counts": "权限总数量", "list": [ { "id": "权限id", "name": "权限名称", "codename": "权限识别名", "content_type": "权限类型" }, ... ], "page": "当前页码", "pages": "总页码", "pagesize": "页容量" }
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
counts | int | 是 | 权限总数量 |
lists | 数组 | 是 | 权限表信息 |
page | int | 是 | 页码 |
pages | int | 是 | 总页数 |
pagesize | int | 是 | 页容量 |
后端实现
from django.contrib.auth.models import Permission, ContentType class PermissionView(ModelViewSet): serializer_class = PermissionSerialzier queryset = Permission.objects.all() pagination_class = PageNum
序列化器的定义
from django.contrib.auth.models import Permission, ContentType class PermissionSerialzier(serializers.ModelSerializer): """ 用户权限表序列化器 """ class Meta: model=Permission fields="__all__"
2.保存权限表数据
在保存数据之前我们需要权限类表数据内容
1、获取权限类型列表数据
接口分析
请求方式: GET /meiduo_admin/permission/content_types/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
[ { "id": "权限类型id", "name": "权限类型名称" }, ... ]
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Id | int | 是 | 权限类型id |
name | 数组 | 是 | 权限类型名称 |
后端实现
from django.contrib.auth.models import Permission, ContentType class PermissionView(ModelViewSet): serializer_class = PermissionSerialzier queryset = Permission.objects.all() pagination_class = PageNum # 获取权限类型数据 def content_types(self,request): # 查询全选分类 content=ContentType.objects.all() # 返回结果 ser=ContentTypeSerialzier(content,many=True) return Response(ser.data)
序列化器的定义
from django.contrib.auth.models import Permission, ContentType class ContentTypeSerialzier(serializers.ModelSerializer): """ 权限类型序列化器 """ class Meta: model=ContentType fields=('id','name')
2、保存权限表数据
接口分析
请求方式:POST /meiduo_admin/permission/perms/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
name | str | 是 | 权限名称 |
codename | str | 是 | 权限识别名 |
content_type | str | 是 | 权限类型 |
返回数据: JSON
{ "id": "权限id", "name": "权限名称", "codename": "权限识别名", "content_type": "权限类型" }
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 权限id |
name | Str | 是 | 权限名称 |
codename | str | 是 | 限识别名 |
content_type | int | 是 | 权限类型 |
后端实现
from django.contrib.auth.models import Permission, ContentType # PermissionView继承的是ModelViewSet 所以保存逻辑还是使用同一个类视图 class PermissionView(ModelViewSet): serializer_class = PermissionSerialzier queryset = Permission.objects.all() pagination_class = PageNum def content_types(self,request): # 查询全选分类 content=ContentType.objects.all() # 返回结果 ser=ContentTypeSerialzier(content,many=True) return Response(ser.data)
3.更新权限表数据
1、 获取修改权限表的详情信息
点就修改按钮时,我们需要先获取要修改的商品详情信息
接口分析
请求方式: GET /meiduo_admin/permission/perms/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
在头部中携带要获取的权限商品ID
返回数据: JSON
{ "id": "权限id", "name": "权限名称", "codename": "权限识别名", "content_type": "权限类型" }
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 权限id |
name | Str | 是 | 权限名称 |
codename | str | 是 | 限识别名 |
content_type | int | 是 | 权限类型 |
后端实现
from django.contrib.auth.models import Permission, ContentType # PermissionView继承的是ModelViewSet 所以获取详情逻辑还是使用同一个类视图 class PermissionView(ModelViewSet): serializer_class = PermissionSerialzier queryset = Permission.objects.all() pagination_class = PageNum def content_types(self,request): # 查询全选分类 content=ContentType.objects.all() # 返回结果 ser=ContentTypeSerialzier(content,many=True) return Response(ser.data)
2、修改权限表
接口分析
请求方式: PUT /meiduo_admin/goods/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
name | str | 是 | 权限名称 |
codename | str | 是 | 权限识别名 |
content_type | str | 是 | 权限类型 |
返回数据: JSON
{
"id": "权限id",
"name": "权限名称",
"codename": "权限识别名",
"content_type": "权限类型"
}
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 权限id |
name | Str | 是 | 权限名称 |
codename | str | 是 | 限识别名 |
content_type | int | 是 | 权限类型 |
后端实现
from django.contrib.auth.models import Permission, ContentType # PermissionView继承的是ModelViewSet 所以更新逻辑还是使用同一个类视图 class PermissionView(ModelViewSet): serializer_class = PermissionSerialzier queryset = Permission.objects.all() pagination_class = PageNum def content_types(self,request): # 查询全选分类 content=ContentType.objects.all() # 返回结果 ser=ContentTypeSerialzier(content,many=True) return Response(ser.data)
4.删除权限表数据
接口分析
请求方式: Delte /meiduo_admin/permission/perms/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
在路径中携带删除的权限表的id值
返回数据: JSON
返回空
后端实现
from django.contrib.auth.models import Permission, ContentType # PermissionView继承的是ModelViewSet 所以删除逻辑还是使用同一个类视图 class PermissionView(ModelViewSet): serializer_class = PermissionSerialzier queryset = Permission.objects.all() pagination_class = PageNum def content_types(self,request): # 查询全选分类 content=ContentType.objects.all() # 返回结果 ser=ContentTypeSerialzier(content,many=True) return Response(ser.data)
3.分组表管理
在系统管理中我们需要完成用户组表的增删改查,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作
获取用户组表列表数据
接口分析
请求方式: GET /meiduo_admin/permission/groups/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
{ "counts": "用户组总数量", "list": [ { "id": "组id", "name": "组名称", }, ... ], "page": "当前页码", "pages": "总页码", "pagesize": "页容量" }
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
counts | int | 是 | 用户组总数量 |
lists | 数组 | 是 | 用户组表信息 |
page | int | 是 | 页码 |
pages | int | 是 | 总页数 |
pagesize | int | 是 | 页容量 |
后端实现
from django.contrib.auth.models import Permission, ContentType, Group class GroupView(ModelViewSet): serializer_class = GroupSerialzier queryset = Group.objects.all() pagination_class = PageNum
序列化器的定义
class GroupSerialzier(serializers.ModelSerializer): class Meta: model=Group fields="__all__"
2.保存分组表数据
在保存数据之前我们需要权限表的数据内容展示在权限中
1、获取权限表数据
接口分析
请求方式: GET /meiduo_admin/permission/simple/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
[ { "id": "权限类型id", "name": "权限类型名称" }, ... ]
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Id | int | 是 | 权限类型id |
name | 数组 | 是 | 权限类型名称 |
后端实现
from django.contrib.auth.models import Permission, ContentType, Group class GroupView(ModelViewSet): serializer_class = GroupSerialzier queryset = Group.objects.all() pagination_class = PageNum # 获取权限表数据 def simple(self, reqeust): pers = Permission.objects.all() ser = PermissionSerialzier(pers, many=True) # 使用以前定义的全选序列化器 return Response(ser.data)
2、保存权限表数据
接口分析
请求方式:POST /meiduo_admin/permission/groups/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
name | str | 是 | 组名称 |
permissions | str | 是 | ["权限id", ...] |
返回数据: JSON
{
"id": "组id",
"name": "组名称"
}
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 组id |
name | Str | 是 | 组名称 |
后端实现
from django.contrib.auth.models import Permission, ContentType, Group # GroupView继承的是ModelViewSet 所以保存逻辑还是使用同一个类视图 class GroupView(ModelViewSet): serializer_class = GroupSerialzier queryset = Group.objects.all() pagination_class = PageNum # 获取权限表数据 def simple(self, reqeust): pers = Permission.objects.all() ser = PermissionSerialzier(pers, many=True) # 使用以前定义的全选序列化器 return Response(ser.data)
3.更新分组表数据
1、 获取修改分组表的详情信息
点就修改按钮时,我们需要先获取要修改的分组表详情信息
接口分析
请求方式: GET /meiduo_admin/permission/groups/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
在头部中携带要获取的分组ID
返回数据: JSON
{ "id": "组id", "name": "组名称", "permissions": [ "权限id", "权限id", ... ] }
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 组id |
name | Str | 是 | 组名称 |
permissions | str | 是 | 限识id |
后端实现
from django.contrib.auth.models import Permission, ContentType, Group # GroupView继承的是ModelViewSet 所以获取详情逻辑还是使用同一个类视图 class GroupView(ModelViewSet): serializer_class = GroupSerialzier queryset = Group.objects.all() pagination_class = PageNum # 获取权限表数据 def simple(self, reqeust): pers = Permission.objects.all() ser = PermissionSerialzier(pers, many=True) # 使用以前定义的全选序列化器 return Response(ser.data)
2、修改权限表
接口分析
请求方式: PUT /meiduo_admin/permission/groups/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
name | str | 是 | 组名称 |
permissions | str | 是 | 权限id |
返回数据: JSON
{ "id": "组id", "name": "组名称", "permissions": [ "权限id", "权限id", ... ] }
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 组id |
name | Str | 是 | 组名称 |
permissions | str | 是 | 限识id |
后端实现
from django.contrib.auth.models import Permission, ContentType, Group # GroupView继承的是ModelViewSet 所以修改逻辑还是使用同一个类视图 class GroupView(ModelViewSet): serializer_class = GroupSerialzier queryset = Group.objects.all() pagination_class = PageNum # 获取权限表数据 def simple(self, reqeust): pers = Permission.objects.all() ser = PermissionSerialzier(pers, many=True) # 使用以前定义的全选序列化器 return Response(ser.data)
4.删除分组表数据
接口分析
请求方式: Delte /meiduo_admin/permission/groups/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
在路径中携带删除的分组表的id值
返回数据: JSON
返回空
后端实现
from django.contrib.auth.models import Permission, ContentType, Group # GroupView继承的是ModelViewSet 所以删除逻辑还是使用同一个类视图 class GroupView(ModelViewSet): serializer_class = GroupSerialzier queryset = Group.objects.all() pagination_class = PageNum # 获取权限表数据 def simple(self, reqeust): pers = Permission.objects.all() ser = PermissionSerialzier(pers, many=True) # 使用以前定义的全选序列化器 return Response(ser.data)
4.管理员信息管理
在系统管理中我们需要完成管理员表的增删改查,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作
1.获取管理员用户列表数据
接口分析
请求方式: GET /meiduo_admin/permission/admins/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
{ "id": "用户id", "username": "用户名", "email": "邮箱", "mobile": "手机号" }
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | int | 是 | 用户id |
username | str | 是 | 用户名 |
str | 是 | 页码 | |
mobile | str | 是 | 总页数 |
后端实现
class AdminView(ModelViewSet): serializer_class = AdminSerializer # 获取管理员用户 queryset = User.objects.filter(is_staff=True) pagination_class = PageNum
序列化器的定义
class AdminSerializer(serializers.ModelSerializer): class Meta: model=User fields="__all__" extra_kwargs={ 'password':{ 'write_only': True } }
保存管理员数据
在保存数据之前我们需要获取权限表数据和分组表数据展示,权限表数据的获取接口已经完成,我们只需要获取分组表数据
1、获取分组表数据
接口分析
请求方式: GET /meiduo_admin/permission/groups/simple/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
[ { "id": 1, "name": "广告组" }, { "id": 2, "name": "商品SKU组" }, ...... ]
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Id | int | 是 | 分组id |
name | 数组 | 是 | 分组名称 |
后端实现
# AdminView继承的是ModelViewSet 所以获取分组逻辑还是使用同一个类视图 class AdminView(ModelViewSet): serializer_class = AdminSerializer queryset = User.objects.filter(is_staff=True) pagination_class = PageNum # 获取分组数据 def simple(self, reqeust): pers = Group.objects.all() ser = GroupSerialzier(pers, many=True) return Response(ser.data)
2、保存管理员数据
接口分析
请求方式:POST /meiduo_admin/permission/admins/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
username | str | 是 | 用户名 |
mobile | str | 是 | 手机号 |
password | int | 是 | 密码 |
str | 否 | 邮箱 | |
groups | list | 是 | 用户组id |
user_permissions | list | 是 | 权限id |
返回数据: JSON
{ "id": "用户id", "username": "用户名", "password": "密码", "mobile": "手机号", "email": "邮箱", "groups": ['用户组id', ...], "user_permissions": ['权限id', ...] }
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
username | str | 是 | 用户名 |
mobile | str | 是 | 手机号 |
str | 否 | 邮箱 | |
groups | list | 是 | 用户组id |
user_permissions | list | 是 | 权限id |
后端实现
# AdminView继承的是ModelViewSet 所以保存分组逻辑还是使用同一个类视图 class AdminView(ModelViewSet): serializer_class = AdminSerializer queryset = User.objects.filter(is_staff=True) pagination_class = PageNum # 获取分组数据 def simple(self, reqeust): pers = Group.objects.all() ser = GroupSerialzier(pers, many=True) return Response(ser.data)
序列化器
class AdminSerializer(serializers.ModelSerializer): class Meta: model=User fields="__all__" extra_kwargs={ 'password':{ 'write_only': True } } # 重写父类方法,增加管理员权限属性 def create(self, validated_data): # 添加管理员字段 validated_data['is_staff'] = True # 调用父类方法创建管理员用户 admin = super().create(validated_data) # 用户密码加密 password = validated_data['password'] admin.set_password(password) admin.save() return admin
更新管理员数据
1、 获取修改管理员的详情信息
点就修改按钮时,我们需要先获取要修改的分组表详情信息
接口分析
请求方式: GET /meiduo_admin/permission/admins/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
{ "id": "用户id", "username": "用户名", "mobile": "手机号", "email": "邮箱", "groups": ['用户组id', ...], "user_permissions": ['权限id', ...] }
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
username | str | 是 | 用户名 |
mobile | str | 是 | 手机号 |
str | 否 | 邮箱 | |
groups | list | 是 | 用户组id |
user_permissions | list | 是 | 权限id |
后端实现
# AdminView继承的是ModelViewSet 所以管理员详情逻辑还是使用同一个类视图 class AdminView(ModelViewSet): serializer_class = AdminSerializer queryset = User.objects.filter(is_staff=True) pagination_class = PageNum # 获取分组数据 def simple(self, reqeust): pers = Group.objects.all() ser = GroupSerialzier(pers, many=True) return Response(ser.data)
2、修改管理员
接口分析
请求方式: PUT /meiduo_admin/permission/admins/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
username | str | 是 | 用户名 |
mobile | str | 是 | 手机号 |
password | int | 是 | 密码 |
str | 否 | 邮箱 | |
groups | list | 是 | 用户组id |
user_permissions | list | 是 | 权限id |
返回数据: JSON
{ "id": "用户id", "username": "用户名", "password": "密码", "mobile": "手机号", "email": "邮箱", "groups": ['用户组id', ...], "user_permissions": ['权限id', ...] }
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
username | str | 是 | 用户名 |
mobile | str | 是 | 手机号 |
password | int | 是 | 密码 |
str | 否 | 邮箱 | |
groups | list | 是 | 用户组id |
user_permissions | list | 是 | 权限id |
后端实现
# AdminView继承的是ModelViewSet 所以管理员信息修改逻辑还是使用同一个类视图 class AdminView(ModelViewSet): serializer_class = AdminSerializer queryset = User.objects.filter(is_staff=True) pagination_class = PageNum # 获取分组数据 def simple(self, reqeust): pers = Group.objects.all() ser = GroupSerialzier(pers, many=True) return Response(ser.data)
删除管理员信息数据
接口分析
请求方式: Delte /meiduo_admin/permission/admins/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
在路径中携带删除的用户id值
返回数据: JSON
返回空
后端实现
# AdminView继承的是ModelViewSet 所以删除逻辑还是使用同一个类视图 class AdminView(ModelViewSet): serializer_class = AdminSerializer queryset = User.objects.filter(is_staff=True) pagination_class = PageNum # 获取分组数据 def simple(self, reqeust): pers = Group.objects.all() ser = GroupSerialzier(pers, many=True) return Response(ser.data)