Как создать аутентификацию пользователя с помощью токенов для нескольких уровней пользователя с помощью API Python Falcon Rest - PullRequest
0 голосов
/ 10 сентября 2018

Я создал остальные 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 пользователя. Он имеет имя пользователя, идентификатор пользователя и access_level (1 или 2) в качестве столбцов. Как я могу создать аутентификацию пользователя с помощью токенов? Любое понимание будет действительно полезным.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

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

Посмотрите на пример AuthMiddleware , вы можете проанализировать запрос и вызвать неавторизованное исключение HTTP_401. Быть совместимым со стандартом HTTP.

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

app = falcon.API(middleware=[
    AuthMiddleware(),
    UserPrivilegeMiddleware()
])
0 голосов
/ 20 сентября 2018

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

...