基於baseauthentication:沒有提供獲取user的方法
基於basejsonwebtokenauthentication:可以由authenticate_credentials()獲取user
auth.py
##區域性使用views.py自定義認證類
from rest_framework.authentication import
baseauthentication
from rest_framework.exceptions import
authenticationfailed
from rest_framework_jwt.settings import
api_settings
jwt_decode_handler =api_settings.jwt_decode_handler
import
jwtfrom .models import
user
class
jwtauthentication(baseauthentication):
defauthenticate(self, request):
#第一步:取出前端傳入的token串(從請求頭的token中取出)
#驗證token是否合法
try:
#通過token,得到payload,在得到的過程中會校驗,是否過期,是否被穿該
payload =jwt_decode_handler(jwt_value)
except
jwt.expiredsignature:
raise authenticationfailed('
簽名過期')
except
jwt.decodeerror:
raise authenticationfailed('
簽名驗證失敗')
except
jwt.invalidtokenerror:
raise authenticationfailed('
未知錯誤')
(payload)
#有沒有問題?每次都要去資料庫查使用者,效率低
#優先用這種
user=user.objects.get(id=payload['
user_id'])
#不需要查資料庫,效率高,存在缺陷,
#user=user(id=payload['user_id'],username=payload['username'])
return
(user, jwt_value)
else
:
#沒帶token串,沒登入
raise authenticationfailed('
您沒有攜帶token
')
##全域性使用settings.py區域性使用,在檢視類中配置
from .auth import
jwtauthentication
class
testview(apiview):
#自己寫的認證類
authentication_classes =[jwtauthentication, ]
defget(self, request):
print(request.user) #
這就是當前登入使用者
return response('
你必須登入,才能看到我
')
#補充:(settings.py)全域性使用,在配置檔案中配置
rest_framework =
#全域性使用後,區域性禁用
class
loginview(apiview):
authentication_classes =
#注意:配置的所有認證,許可權,頻率。。。優先用檢視類自己的,再用配置檔案的,最後用drf內建的
#post測試補充:token過期時間很快,改改過期時間,配置7天過期
jwt_auth =
使用者認證自定義
設定郵箱和使用者名稱和手機號均可登入 authentication backends users.views.custombackend class custombackend modelbackend 自定義使用者驗證規則 defauthenticate self,username none pa...
Shiro 自定義角色 認證
由於shiro filterchaindefinitions中 roles預設是and,user,roles system,general 比如 roles system,general 表示同時需要 system 和 general 2個角色才通過認證 所以需要自定義 繼承 authorizati...
Shiro安全框架 自定義認證
1.和之前一樣先引入依賴 org.apache.shiro shiro web org.apache.shiro shiro core org.apache.shiro shiro spring commons logging commons logging 1.22.配置好自定義shiro.ini...