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)