亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringCloud+Tornado基于jwt實(shí)現(xiàn)請(qǐng)求安全校驗(yàn)功能

 更新時(shí)間:2020年12月21日 09:51:16   作者:95.8℃  
這篇文章主要介紹了SpringCloud+Tornado基于jwt實(shí)現(xiàn)請(qǐng)求安全校驗(yàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

項(xiàng)目背景

在實(shí)際項(xiàng)目中,Tornado項(xiàng)目作為一個(gè)微服務(wù)納入SpringCloud體系,該過(guò)程中涉及到TornadoSpring體系的安全驗(yàn)證,也就是權(quán)限調(diào)用校驗(yàn),在該項(xiàng)目中Tornado是通過(guò)SpringCloud中的Feign調(diào)用的,經(jīng)過(guò)一系列實(shí)驗(yàn),最后選用jwt來(lái)實(shí)現(xiàn)這個(gè)權(quán)限效驗(yàn)的過(guò)程。

實(shí)現(xiàn)思路

用戶(hù)進(jìn)行登陸認(rèn)證(后臺(tái)微服務(wù)),認(rèn)證成功后調(diào)用Tornado項(xiàng)目的認(rèn)證接口生成token,該值返回到后臺(tái)微服務(wù)保存在會(huì)話(huà)中,下一次請(qǐng)求時(shí)帶上該token值讓服務(wù)器進(jìn)行校驗(yàn),校驗(yàn)成功則返回正常的響應(yīng),否則返回錯(cuò)誤信息。

項(xiàng)目結(jié)構(gòu)

在這里插入圖片描述

common - authServer.py是認(rèn)證接口
common - basicServer.py是示例接口
handlers - baseHandler.py中放了兩種校驗(yàn)方式,會(huì)在basicServer.py的調(diào)用示例中貼出
utils - jwtUtils.py是生成與校驗(yàn)token的
utils - responseUtils.py是返回結(jié)果工具類(lèi)

具體實(shí)現(xiàn)

jwtUtils.py

# -*- coding:utf-8 -*-
import jwt
import datetime
from jwt import exceptions
from utils.responseUtils import JsonUtils

JWT_SALT = '1qazxdr5'


def create_token(payload, timeout=12):
 """
 創(chuàng)建token
 :param payload: 例如:{'user_id':1,'username':'xxx@xxx.xx'}用戶(hù)信息
 :param timeout: token的過(guò)期時(shí)間,默認(rèn)20分鐘
 :return:
 """
 headers = {
  'typ': 'jwt',
  'alg': 'HS256'
 }
 payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(minutes=timeout)
 result = jwt.encode(payload=payload, key=JWT_SALT, algorithm="HS256", headers=headers).decode('utf-8')
 return result


def parse_payload(token):
 """
 對(duì)token進(jìn)行校驗(yàn)并獲取payload
 :param token:
 :return:
 """
 try:
  verified_payload = jwt.decode(token, JWT_SALT, True)
  print(verified_payload)
  return JsonUtils.success('認(rèn)證通過(guò)')
 except exceptions.ExpiredSignatureError:
  return JsonUtils.noAuth('token已失效')
 except jwt.DecodeError:
  return JsonUtils.noAuth('token認(rèn)證失敗')
 except jwt.InvalidTokenError:
  return JsonUtils.noAuth('非法的token')

baseHandler.py

# -*- coding:utf-8 -*-
import functools
import json
import tornado.web
from utils import jwtUtils
from utils.responseUtils import JsonUtils


# 方式一:authenticated 裝飾器
def authenticated(method):
 @functools.wraps(method)
 def wrapper(self, *args, **kwargs):
  """
  這里調(diào)用的是 current_user 的 get 方法(property裝飾),
  """
  # 通過(guò)token請(qǐng)求頭傳遞token
  head = self.request.headers
  token = head.get("token", "")
  if not token:
   self.write(JsonUtils.noAuth("未獲取到token請(qǐng)求頭"))
   self.set_header('Content-Type', 'application/json')
   return

  result = json.loads(jwtUtils.parse_payload(token)) # 將json解碼
  print(result)
  token_msg = json.dumps(result)

  if result['sta'] != '00':
   self.write(token_msg)
   self.set_header('Content-Type', 'application/json')
   return

  return method(self, *args, **kwargs)
 return wrapper


# 方式二:進(jìn)行預(yù)設(shè) 繼承tornado的RequestHandler
class BaseHandler(tornado.web.RequestHandler):
 def prepare(self):
  super(BaseHandler, self).prepare()

 def set_default_headers(self):
  super().set_default_headers()


# 進(jìn)行token校驗(yàn),繼承上面的BaseHandler
class TokenHandler(BaseHandler):
 def prepare(self):
  # 通過(guò)token請(qǐng)求頭傳遞token
  head = self.request.headers
  token = head.get("token","")
  if not token:
   self.authMsg = json.dumps(JsonUtils.noAuth("未獲取到token請(qǐng)求頭"))

  result = json.loads(jwtUtils.parse_payload(token)) # 將json解碼
  print(result)

  if result['sta'] != '00':
   self.isAuth = False
  else:
   self.isAuth = True

  self.authMsg = json.dumps(result)

authServer.py

import tornado.web
from utils import jwtUtils
from utils.responseUtils import JsonUtils


class authHandler(tornado.web.RequestHandler):
 def post(self, *args, **kwargs):
  """
  安全認(rèn)證接口
  :param args:
  :param kwargs:
  :return:
  """
  username = self.get_argument("username")
  print("authHandler:" + username)

  if not username:
   self.write(JsonUtils.error("參數(shù)異常"))
  else:
   token = jwtUtils.create_token({"username": username})
   print("token:" + token)
   self.write(JsonUtils.success(token))

  self.set_header('Content-Type', 'application/json')

basicServer.py

import tornado.web
import json
from pandas.core.frame import DataFrame
from handlers import baseHandler
from utils.responseUtils import JsonUtils
from handlers.baseHandler import authenticated


class StringHandler(baseHandler.TokenHandler, tornado.web.RequestHandler):
 """
 *** TokenHandler驗(yàn)證,對(duì)應(yīng)baseHandler.py中的方式二 ***
 """
 def get(self):
  username = self.get_argument('username', 'Hello')

  # 權(quán)限認(rèn)證通過(guò)
  if self.isAuth:
   self.write(JsonUtils.success(username))
  else:
   self.write(self.authMsg))

  self.set_header('Content-Type', 'application/json')


class TestHandler(tornado.web.RequestHandler):
 """
 *** authenticated驗(yàn)證,對(duì)應(yīng)baseHandler.py中的方式一 ***
 """
 @authenticated
 def post(self):
  username = self.get_argument('username', 'Hello')
  self.write(JsonUtils.success(username))
  self.set_header('Content-Type', 'application/json')

responseUtils.py

from tornado.escape import json_encode, utf8


class JsonUtils(object):
 @staticmethod
 def success(response):
  """
  正確返回
  :param response: 返回結(jié)果
  :return: string, {"message": "ok", "sta": "00", "data": }
  """
  return json_encode({"message": "ok", "sta": "00", "data": response})

 @staticmethod
 def info(message):
  """
  提示返回
  :param message: 提示信息
  :return: string,
  """
  return json_encode({"message": str(message), "sta": "99001", "data": None})

 @staticmethod
 def error(message):
  """
  錯(cuò)誤返回
  :param message: 錯(cuò)誤信息
  :return: string,
  """
  return json_encode({"message": str(message), "sta": "9999", "data": None})

 @staticmethod
 def noAuth(message):
  """
  無(wú)權(quán)限返回
  :param message: 錯(cuò)誤信息
  :return: string,
  """
  return json_encode({"message": str(message), "sta": "403", "data": None})

下面是一些調(diào)用的結(jié)果圖示:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

.end

到此這篇關(guān)于SpringCloud+Tornado基于jwt實(shí)現(xiàn)請(qǐng)求安全校驗(yàn)的文章就介紹到這了,更多相關(guān)SpringCloud+Tornado實(shí)現(xiàn)請(qǐng)求安全校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java阻塞隊(duì)列必看類(lèi):BlockingQueue快速了解大體框架和實(shí)現(xiàn)思路

    Java阻塞隊(duì)列必看類(lèi):BlockingQueue快速了解大體框架和實(shí)現(xiàn)思路

    這篇文章主要介紹了Java阻塞隊(duì)列必看類(lèi):BlockingQueue快速了解大體框架和實(shí)現(xiàn)思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Maven2 plugin開(kāi)發(fā)教程詳解

    Maven2 plugin開(kāi)發(fā)教程詳解

    這篇文章主要為大家詳細(xì)介紹了Maven2 plugin的開(kāi)發(fā)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑

    解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑

    這篇文章主要介紹了解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot請(qǐng)求發(fā)送與信息響應(yīng)匹配實(shí)現(xiàn)方法介紹

    SpringBoot請(qǐng)求發(fā)送與信息響應(yīng)匹配實(shí)現(xiàn)方法介紹

    這篇文章主要介紹了SpringBoot請(qǐng)求發(fā)送與信息響應(yīng)匹配實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10
  • Java通過(guò)動(dòng)態(tài)規(guī)劃設(shè)計(jì)股票買(mǎi)賣(mài)最佳時(shí)機(jī)

    Java通過(guò)動(dòng)態(tài)規(guī)劃設(shè)計(jì)股票買(mǎi)賣(mài)最佳時(shí)機(jī)

    動(dòng)態(tài)規(guī)劃可謂是大名鼎鼎,筆試面試中的高頻考點(diǎn),也是重點(diǎn)難點(diǎn),動(dòng)態(tài)規(guī)劃類(lèi)型題目靈活多變,難度系數(shù)也相對(duì)較高,往往我們做不好動(dòng)態(tài)規(guī)劃的題目就會(huì)與心儀的offer失之交臂,本篇文章我們就一起來(lái)研究一下動(dòng)態(tài)規(guī)劃設(shè)計(jì)股票買(mǎi)賣(mài)最佳時(shí)機(jī)
    2022-10-10
  • 解決@SpringBootTest 單元測(cè)試遇到的坑

    解決@SpringBootTest 單元測(cè)試遇到的坑

    這篇文章主要介紹了解決@SpringBootTest 單元測(cè)試遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF

    Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF

    FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序。本文主要介紹了在Java中如何基于FFmpeg進(jìn)行Mp4視頻到Gif動(dòng)圖的轉(zhuǎn)換,感興趣的小伙伴可以了解一下
    2022-11-11
  • Spring服務(wù)注解有哪些

    Spring服務(wù)注解有哪些

    這篇文章主要介紹了Spring服務(wù)注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2016-11-11
  • Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized簡(jiǎn)介

    Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized簡(jiǎn)介

    雖然多線(xiàn)程編程極大地提高了效率,但是也會(huì)帶來(lái)一定的隱患。比如說(shuō)兩個(gè)線(xiàn)程同時(shí)往一個(gè)數(shù)據(jù)庫(kù)表中插入不重復(fù)的數(shù)據(jù),就可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)中插入了相同的數(shù)據(jù)。今天我們就來(lái)一起討論下線(xiàn)程安全問(wèn)題,以及Java中提供了什么機(jī)制來(lái)解決線(xiàn)程安全問(wèn)題。
    2016-05-05
  • servlet生命周期_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    servlet生命周期_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了servlet生命周期的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評(píng)論