Django框架:13、csrf跨站請求偽造、auth認證模組及相關用法

kngk發表於2023-01-02

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

image-20230102154454470

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相關表沒有建立)

相關文章