Django框架
目錄
一、csrf跨站請求偽造
1、簡介
csrf是django預設中介軟體中的一道,它用於驗證網頁的真偽性,透過在在前端頁面設定csrf_token令牌,這樣轉遞到後端的資訊將會在csrf中介軟體中進行驗證,虛假的網站中不會有csrf令牌的鍵值對,這樣就虛假的網站所傳遞來的資訊將會被csrf中介軟體所阻擋,無法透過django的中介軟體層
2、csrf校驗策略
form表單csrf策略
透過在form表單內新增{% csrf_token %}
<body>
<form action="" method="post">
{% csrf_token %}
<p>使用者名稱:
<input type="text" name="name" value="">
</p>
<p>密碼:
<input type="password" name="pwd" value="">
</p>
<input type="submit" value="提交">
</form>
</body>
在form表單內部新增csrf令牌後,表單內部將會自動生成一個input標籤,該標籤內部會生成一個name屬性和value屬性,value屬性的值在每次重新整理頁面時自動生成,當我們在再點選提交後該標籤內的值會被傳遞到django的csrf中介軟體中進行驗證,如果驗證沒有透過此次提交的所有資料都不會生效
ajax請求csrf策略
方式一:手動新增csrf鍵值對
<script>
$('#button').click(function () {
$.ajax({
url:'',
type:'post',
data: {'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()}
})
})
</script>
方式二:利用模板語法獲取
<script>
$('#button').click(function () {
$.ajax({
url:'',
type:'post',
data:{'csrfmiddlewaretoken':'{{ csrf_token }}'}
})
})
</script>
方式三:匯入官方JS指令碼
參考:https://www.cnblogs.com/Dominic-Ji/p/9234099.html
3、csrf相關裝飾器
在我們編寫程式碼時,可能並不是所有的檢視函式都需要校驗csrf,例如:
1.整個django專案都校驗csrf 但是某些個檢視函式\類不想校驗
2.整個django專案都不校驗csrf 但是某些個檢視函式\類需要校驗
這時候可以透過以下幾種方法來進行驗證或取消驗證
FBV新增裝飾器方式
1、匯入模組:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
2、具體用法:
# 校驗csrf (settings中csrf中介軟體沒有開啟的情況下也會校驗)
@csrf_protect
def transfer_func(request):pass
# 不校驗csrf
@csrf_exempt
def transfer_func(request):pass
CBV新增裝飾器方式
1、匯入模組:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
from django.views import View
2、全域性不校驗的情況下將指定的類/功能函式校驗:(三種方式)
# 方式一:指定類下某個功能函式進行校驗
@method_decorator(csrf_protect, name='post')
class Login(views.View):
def post(selfs, request):
pass
# 方式二:直接將類中將需要校驗的功能函式進行裝飾
class Login(views.View):
@method_decorator(csrf_protect)
def post(selfs, request):
pass
# 方式三:該類中所有功能函式都校驗csrf
class Login(views.View):
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(selfs, request):
pass
2、全域性校驗csrf的情況下指定類不校驗:(一種方式)
class Login(views.View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(selfs, request):
pass
二、auth認證模組
1、簡介
django自帶一個admin路由 但是需要我們提供管理員賬號和密碼
如果想要使用admin後臺管理 需要先建立表 然後建立管理員賬號,直接執行資料庫遷移命令即可產生預設的auth_user表,該表就是admin後臺管理預設的認證表
建立超級管理員
1、建立超級管理員需要在pycharm的終端中輸入指令:
python38 manage.py createsuperuser
2、auth認證相關模組及操作
auth 模組
1、匯入模組
from django.contrib import auth
2、相關功能:
1.獲取使用者(判斷使用者名稱和密碼)
user_obj = auth.authenticate(request,
username=username,
password=password)
# 需要傳入三個固定引數,request物件、使用者名稱、密碼,返回使用者物件
2.記錄使用者登陸狀態(在前端儲存cokie)
auth.login(request,user_obj)
User 模組
1、匯入模組:
from django.contrib.auth.models import User
2、相關功能:
1.建立普通使用者
User.objects.create_user(username=username, password=password)
2.獲取登入使用者物件資料(需要先用auth模組儲存使用者登陸狀態,未登陸獲取到的時匿名)
request.user
3.判斷使用者是否登入(需要先用auth模組儲存使用者登陸狀態)
request.user.is_authenticated
4.校驗原密碼是否正確(需要先用auth模組儲存使用者登陸狀態)
request.user.check_password(原密碼)
5.修改密碼(需要先用auth模組儲存使用者登陸狀態)
request.user.set_password(新密碼)
request.user.save()
6.退出登入(需要先用auth模組儲存使用者登陸狀態)
auth.logout(request)
login_required 模組
1、匯入模組:
from django.contrib.auth.decorators import login_required
2、相關功能: # 用於校驗使用者是否登入,未登入可以控制跳轉頁面
1.@login_required(login_url='/login/') 區域性配置
2.@login_required 全域性配置
配置檔案中LOGIN_URL = '/login/'
3、擴充auth_user表
還想使用auth模組的功能 並且又想擴充套件auth_user表的欄位
思路1:一對一欄位關聯
思路2:替換auth_user表
步驟1:模型層編寫模型類繼承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# 填寫AbstractUser表中沒有的欄位
phone = models.BigIntegerField()
desc = models.TextField()
步驟2:一定要在配置檔案中宣告替換關係
AUTH_USER_MODEL = 'app01.UserInfo'
ps:替換還有一個前提 就是資料庫遷移沒有執行過(auth相關表沒有建立)