Как создать аутентификацию пользователя с токенами для нескольких пользовательских уровней с api python falcon rest

Я создал api для отдыха, используя python falcon api. Это для доступа к прогнозным значениям конкретного банкомата и чтения, обновления, удаления значений.

import falcon
import MySQLdb
import json


import re
import mysql.connector
from mysql.connector import  Error

class TesResource:

def on_get(self, req, resp):

    try:
        atmid=req.get_param('atm_key_id')
        datestart=req.get_param('prediction_date_start')
        dateend=req.get_param('prediction_date_end')

        if atmid is None or atmid=="" or datestart is None or dateend is None:
            resp.body=json.dumps({'error': 'Parameter is invalid'})
            resp.status=falcon.HTTP_500
            return resp

        conn = mysql.connector.connect(host='localhost', database='bank', user='root', password='', autocommit=True)
        if conn.is_connected():
            print('connected')

        cursor=conn.cursor()

        #q="SELECT prediction_amount FROM prediction WHERE atm_key_id=5 AND (prediction_date BETWEEN '2017-10-01' AND '2017-10-1')"
        q="SELECT prediction_amount FROM prediction WHERE atm_key_id=%s AND (prediction_date BETWEEN %s AND %s)" 
        #q=("SELECT * FROM prediction")
        cursor.execute(q,(atmid, datestart, dateend,))
        rows=cursor.fetchall()

        output={'tes':[]}
        for row in rows:

            #data={"key":row[0], "amount":float(row[2])}
            data={"amount":float(row[0])}
            output['tes'].append(data)

        resp.status=falcon.HTTP_200
        resp.body=json.dumps(output, encoding='utf-8')
        cursor.close()
        conn.close()

    except Exception as e:
        resp.body=json.dumps({'error':str(e)})
        resp.status=falcon.HTTP_500
        return resp

def on_put(self, req, resp):

    try:


        atmid=req.get_param('atm_key_id')
        date=req.get_param('prediction_date')
        amount=req.get_param('prediction_amount')
        if atmid is None or atmid=="" or date is None or amount is None:
            resp.body=json.dumps({'error': 'Parameter is invalid'})
            resp.status=falcon.HTTP_500
            return resp

        conn = mysql.connector.connect(host='localhost', database='bank', user='root', password='', autocommit=True)
        if conn.is_connected():
            print('connected')

        cursor=conn.cursor()

        q="""UPDATE `prediction` SET `prediction_amount`=%s WHERE atm_key_id=%s AND prediction_date=%s """
        cursor.execute(q,(amount, atmid, date,))
        conn.commit()
        cursor.close()

        output={'status':"Data successfully updated"}

        resp.status=falcon.HTTP_200
        data_resp=json.dumps(output, encoding='utf-8')
        resp.body=data_resp


    except Exception as e:
        conn.rollback()
        resp.body=json.dumps({'error':str(e)})
        resp.status=falcon.HTTP_500
        return resp


def on_delete(self, req, resp):

    try:
        atmid=req.get_param('atm_key_id')
        date=req.get_param('prediction_date')
        if atmid is None or atmid=="" or date is None:
            resp.body=json.dumps({'error': 'Parameter is invalid'})
            resp.status=falcon.HTTP_500
            return resp

        conn = mysql.connector.connect(host='localhost', database='bank', user='root', password='', autocommit=True)
        if conn.is_connected():
            print('connected')

        cursor=conn.cursor()

        q="""DELETE FROM `prediction` WHERE atm_key_id=%s AND prediction_date=%s"""

        cursor.execute(q, (atmid, date,))
        conn.commit()
        cursor.close()

        output={'status':"Data successfully deleted"}

        resp.status=falcon.HTTP_200
        data_resp=json.dumps(output, encoding='utf-8')
        resp.body=data_resp

    except Exception as e:

        conn.rollback()
        resp.body=json.dumps({'error':str(e)})
        resp.status=falcon.HTTP_500
        return resp

Есть два уровня пользователя. Каждый может получить значение прогноза для определенной даты или диапазона дат (уровень доступа 1). Но только авторизованная группа людей может обновить или удалить значение прогноза (уровень доступа 2). У меня есть пользовательская таблица mysql. У него есть имя пользователя, идентификатор пользователя и уровень доступа (1 или 2) в качестве столбцов. Как я могу создать аутентификацию пользователя с помощью токенов? Любая информация будет действительно полезной.

3
0
2 411
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете создать декоратор аутентификации, который будет проверять, есть ли у пользователя уровень доступа 2 или нет. Используйте этот декоратор на on_update и on_delete.

Ответ принят как подходящий

Вы можете использовать промежуточное ПО и проверять там пути, токены и другие параметры до обработки запроса. Это самый чистый способ, поскольку вы можете добавить несколько промежуточных программ для каждого уровня и позволить ресурсам очиститься и отделиться от этой логики уровня привилегий.

Взгляните на пример AuthMiddleware, вы можете проанализировать запрос и вызвать неавторизованное исключение HTTP_401. Соответствовать стандарту HTTP.

Чтобы добавить несколько промежуточных программ, вы можете использовать конструктор Falcon API.

app = falcon.API(middleware=[
    AuthMiddleware(),
    UserPrivilegeMiddleware()
])

Другие вопросы по теме