fastapi 用户权限,登录,退出登录组件

Python FastAPI框架实现一个基本的用户登录接口,并添加权限功能 阅读详情
AI摘要

本文介绍了一种基于FastAPI框架的权限组件实现方法,该组件借鉴Flask-Login的设计思路,改进了默认组件的安全性和灵活性,支持不同角色的权限管理和会话管理。

将在前面的话

fastapi默认的组件,官网上其实也有,关于权限什么的,在这里 FastAPI 安全性简介
但是我在学习过程中,发现他官方提供的默认组件,有以下缺陷(当然这些是我个人的一些看法,可能我FastAPI本身学习的不到位,没有get到他的一些知识点,如果有大佬能够有更好的解决方案,希望能放在评论区 ):

  1. 用户名,过期时间等关键信息,存储在客户端,并且使用默认的jwt,基本没有加密存在安全隐患
  2. 默认组件并不会刷新用户验证信息的过期时间,每次登录会话持续的时间是固定的,而不是随着用户的访问,刷新持续时间。
  3. 提供的功能并不完善,如果加入不同的权限,其实还是有很多工作量。
  4. 默认将授权码,放在了requests headers里,很多时候其实不太方便,主要是习惯了cookie,毕竟浏览器会自动携带cookie信息。

所以我参考flask-login,使用Fastapi依赖的方式,写了一个权限组件,考虑到这部分组件未来开发可能还是用得到的,所以特意上传一下。

第一节是使用起来的效果,后续是具体实现的过程,详细阅读的话建议把第一节放在最后看。

1. 在视图中使用

  • 首先导入实例化的权限管理对象
from ..permission import role_required
  • 当某个视图,需要某权限才能访问的时候,我们可以这样调用:
    通过fastapi框架的依赖,就可以先通过权限组件,获取当前的用户信息,通过传递不同的参数,锁定不同的权限需要,如果权限不足,则返回错误的状态码。
@router.get("/")
async def read_users(
    current_user: schemas.PyUser=Depends(role_required("管理员"))
):
    print(current_user)
    return [{"username": "Foo"}, {"username": "Bar"}]
  • 登录时,注册当前用户
    调用role_required.login(response, current_user),将当前用户注册进权限组件,这样当前用户访问其他需要权限的路由时,就会自动判断权限了
@router.post("/login/")
async def login(
    user:schemas.PyUserLogin, 
    response: Response,
    session: Session = Depends(get_db),
):
    dbuser = session.query(db.User).filter(db.User.username == db.User.username).first()
    if not (dbuser and dbuser.verify_password(user.password)):
        raise ApiException(
            code = 1001,
            message = "账号不存在或密码错误"
        )
    current_user = schemas.PyUser.from_orm(dbuser)
    role_required.login(response, current_user)
    return ApiResponse(
        code = 0,
        message = "登录成功",
        data = {
            "username": current_user.username,
            "realname": current_user.realname,
            "description": current_user.description
        }
    )
  • 登出时,注销当前用户
    登出时,调用role_required.logout(request)即可从权限组件中注销掉当前用户,此时组件中用户对应的cookie会立即移除,这样就去掉了用户的登录信息了
@router.post("/logout/")
async def logout(
    request: Request,
    _: schemas.PyUser=Depends(role_required("管理员"))
):
    current_user = role_required.logout(request)
    return ApiResponse(
        code = 0,
        message = "登出成功",
        data = {
            "username": current_user.username,
            "realname": current_user.realname,
            "description": current_user.description
        }
    )

2. 文件结构

在这里插入图片描述

权限定义

这部分的定义如果又需要的话,可以从数据库查询之类的,等等,这里只使用了最简单的定义
这部分代码在文件roles.py 中

roles = {
    "超级管理员": 1,
    "管理员": 2,
    "标注员": 3,
    "编辑者": 4,
    "审核员": 5,
    "游客": 6,
}

3. 权限组件类

权限组件核心类,代码在require.py里
三个主要函数:

  1. login() 用户登录
  2. logout() 用户登出
  3. self() 定义访问需要的权限
  • 需要注意的是,我在出现权限不足时,返回的ApiException是一个本项目中自定义的错误状态,如有需要,自行更改。
  • 具体的使用方法在下面
from fastapi import HTTPException, Response, Request
import copy
from datetime import datetime, timedelta
import uuid
from starlette import status
from ..exception.apiexception import ApiResponse, ApiException

class RoleRequired:
    def __init__(
        self,
        guest,
        roles,
        redirect_url: str = None,
        expire_minutes: int = 30,
        clear_interval: int = 60,
    ):
        self.sessions = {}
        self.roles = roles
        self.guest = guest
        self.redirect_url = redirect_url
        self.expire_minutes = expire_minutes
        self.userclass = type(self.guest)
        self.last_clear_time = datetime.utcnow()
        self.interval = timedelta(minutes=clear_interval)


    def __clear_overstayed(self):
        now = datetime.utcnow()
        if (now - self.last_clear_time) < self.interval:
            return
        self.last_clear_time = now
        self.sessions = { k: v for k, v in self.sessions.items() if v['exp'] < now }


    def __create_token(self, response: Response, user=None):
        # print(self.sessions)
        self.__clear_overstayed()
        authorization = str(uuid.uuid1())
        response.set_cookie(key="authorization", value=authorization)
        if not user:
            user = copy.deepcopy(self.guest)
        self.sessions[authorization] = {
            "user": user,
            "exp": datetime.utcnow() + timedelta(minutes=self.expire_minutes)
        }
        return self.sessions[authorization]

    def __update_exp(self, authorization):
        exp = datetime.utcnow() + timedelta(minutes=self.expire_minutes)
        self.sessions[authorization]["exp"] = exp
        return self.sessions[authorization]

    def __verify_roles(self, user, roleids):
        if isinstance(roleids, list):
            return user.roleid in roleids
        return user.roleid == roleids


    def login(self, response: Response, user):
        # assert type(user) == type(self.guest)
        current_session = self.__create_token(response, user)
        return current_session['user']
    
    def logout(self, request: Request):
        authorization = request.cookies.get("authorization", None)
        try:
            current_session = self.sessions.pop(authorization)
            return current_session['user']
        except :
            raise ApiException(code=1005, message="当前未登录,登出发生错误")
        
    def __call__(self, *roles, **kwargs):
        login_only = kwargs.get("login_only", False)
        roles = [ self.roles[x] for x in roles ]
        if login_only:
            roles = list(self.roles.values())
        async def func(request: Request, response: Response) -> self.userclass:
            authorization = request.cookies.get("authorization", None)
            if not authorization or authorization not in self.sessions:
                current_session = self.__create_token(response)
            else:
                ntime = datetime.utcnow()
                session = self.sessions.get(authorization, None)
                if session['exp'] < ntime:
                    self.sessions.pop(authorization)
                    current_session = self.__create_token(response)
                else:
                    current_session = self.__update_exp(authorization)
            current_user = current_session['user']
            if not roles or self.__verify_roles(current_user, roles):
                return current_session['user']
            else:
                raise ApiException(
                    code=1004, message="权限不足"
                )
        return func

4. 实例化权限类

这部分代码在 权限包中__init__.py 文件中
实例化的主要参数如下:

  • guest:当没有登录的游客访问时,默认给他们的一个游客账户
  • roles:权限的字典,就是roles.py中定义的字典
  • redirect_url: str = None:没有登录或者没有权限时,跳转的url(这部分功能没实现,因为直接返回1004权限不足状态码了)
  • expire_minutes: int = 30:登录状态持续时间,过期的cookie将不再生效
  • clear_interval: int = 60:时间间隔超过60分钟时,如果有请求,将会清空一次过期的cookie
from .require import RoleRequired
from ..models.schemas import  users as schemas
from .roles import roles
from app.settings import SESSION_DURATION

role_required = RoleRequired(guest=schemas.PyUser( userid=0, username="guest", password="guest", realname="guest", roleid=6 ),
                             roles=roles,
                             expire_minutes=SESSION_DURATION)
fastapi用户登录模块——“用户登录“ 【代码】fastapi用户登录模块。 阅读详情

相关推荐

FastAPI Web框架教程 第9章 登录认证相关

对于很多应用来说,注册接口是必可不少的。你会发现就一个简单的注册接口,其实还是有很多问题需要我们思考的。首先,注册接口一般是将用户的个人信息提交给服务端,因此,我们选择POST请求然后,注册信息中一般都包含密码,所以不能简单的在查询参数中提交给后端,需要把数据放在请求体中。最后,请求体如何使用JSON格式,那注册时如果有上传文件的需求,将比较麻烦。因此我们使用Form表单的形式。结论:对于常见的注册接口,使用POST,使用Form表单来上传数据。

此博客内容主要是小可日常工作中的一些问题解决的记录整理而成 1894

【Python开发】FastAPI 08:Security 登录认证

FastAPI提供了多种工具,可帮助你以标准的方式轻松、快速地处理安全性,而无需研究和学习所有的安全规范,这相比花费大量的精力和代码处理安全性和身份认证很有好了(比如java😂)。

尹煜的博客 6893

高效复用PCB设计:Cadence Sub-Drawing跨项目复制技巧

本文详细介绍了Cadence Allegro中Sub-Drawing功能的应用技巧,帮助PCB工程师高效复用成熟设计模块。通过分步教学,从精准导出到完美导入,并提供了解决坐标错位与DRC冲突的实用避坑指南。掌握这一技巧能显著提升设计效率,实现团队知识的标准化积累与快速复用。

weixin_29172201的博客 398

FastAPI通用权限管理系统

一款 Python 语言基于FastAPI、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。

一米阳光的博客 1695

SpringBoot+Maven打包实战:把项目变成SDK供其他团队调用

本文详细介绍了如何将SpringBoot项目改造并打包成可被其他项目依赖的SDK。通过调整Maven配置,剥离SpringBoot父依赖与启动类,并定制打包插件,最终生成标准的JAR依赖库,实现从“可执行应用”到“组件化SDK”的优雅转变,便于团队间功能复用。

assembly8low的博客 827

SCDM学习笔记(5)

几何前处理后一般会获得几何的固体区域,然而当进行流体仿真的时候是对流体的区域进行计算的。因此,如何快速地从固体的几何模型获得流体的几何模型是一个重点问题。 流体问题一般可分为内流场与外流场问题,对于内流场问题,SCDM有专门的处理工具 工程图纸大致如下: 要创建这个几何的大致策略是画出截面的圆形,再画出轴线,通过扫掠的方式建立几何。 以上是mixing的国体区域,通过体积抽...

diyhoo的编程小屋 6358

FastAPI JWT 登录认证实战:Access Token、Refresh Token 与权限保护

本文介绍了在前后端分离项目中如何使用FastAPI实现JWT(JSON Web Token)身份认证机制。主要内容包括:JWT的基本概念与结构,其由Header、Payload和Signature三部分组成;用户登录流程,涉及密码哈希处理、Token生成与验证;具体实现方案,如创建AccessToken和RefreshToken、保护接口、Token刷新机制;安全注意事项,包括密钥管理、Token存储、退出登录处理等;以及常见误区,如JWT数据并非加密、仍需服务器状态管理等。文章强调,完整的认证系统需结合身

jren_099的博客 336

24V供电D1047/B817对管AB类音频功放设计与制作全解析

音频功率放大器是电子系统将微弱音频信号放大驱动扬声器的核心电路,其核心原理是通过晶体管或集成电路对信号进行电压和电流放大。从技术价值看,优秀的功放设计需兼顾效率、保真度与稳定性,AB类放大器便是经典折中方案,它在A类低失真与B类高效率间取得平衡。在应用场景上,这类电路广泛应用于家用音响、多媒体音箱、车载音频及DIY音频项目。本文聚焦于一个采用24V直流供电、以D1047和B817互补对管为核心输出级的AB类功放实例,深入剖析其**电路设计**与**元件选型**,涵盖从BC547小信号放大、偏置设置、PCB布

weixin_31355483的博客 415

【九】fastapi+vue实现token验证登录

退出登录直接清楚token。fastapi使用的jwt做的验证: https://fastapi.tiangolo.com/zh/tutorial/security/oauth2-jwt/token_verify.py 三个方法,

weixin_42916710的博客 2051

OpenFOAM-多孔介质模型(porous media)

文章目录一、多孔介质(porous media)二、使用步骤1.达西定律2.Darcy-Forchheimer3.OpenFOAM fvOptions4.paraview动画每帧显示时间(Annotate Time)5.参考内容总结 一、多孔介质(porous media) 在流体力学中,流体流经多孔介质是指流体流经多孔介质时的行为方式,如海绵或木材,或使用沙子或其他多孔材料过滤水。 我们将展示如何设置多孔层,并使用OpenFOAM模拟流体通过该介质。 二、使用步骤 1.达西定律 达西定律最初是由达西通.

zq93538196的博客 9938

KEIL MDK 生成bin文件实战:C51与ARM双平台配置指南

本文详细介绍了在KEIL MDK开发环境中,为C51和ARM双平台自动生成BIN文件的实战方法。针对C51平台,通过srec_cat.exe工具编写批处理脚本并集成到KEIL;针对ARM平台,则利用fromelf.exe工具直接配置。文章还提供了通用脚本方案和路径、变量、版本兼容性等常见问题的避坑指南,帮助开发者高效完成嵌入式程序部署。

weixin_29188997的博客 346

Python FastAPI实现钉钉SSO(含浏览器跳转登录和扫码登录)

需要钉钉开发者权限。

XerCis的博客 744

手把手教你用TUSB2E22中继器实现eUSB2与USB 2.0互转(附实测数据对比)

本文详细介绍了如何利用TUSB2E22中继器实现eUSB2与USB 2.0的高效互转,包括技术背景、硬件设计要点、信号完整性测试方法及故障排查策略。通过实测数据对比,展示了TUSB2E22在信号延迟、功耗和眼图性能上的显著优势,为工程师提供了实用的工程方案。

weixin_29199873的博客 283

Mini-RBAC:基于FastAPI和Vue3的轻量级权限管理框架

Mini-RBAC是一个基于Python(FastAPI)和VUE3实现的极简后台管理系统,专注于核心权限控制功能。该项目保留了RBAC(基于角色的访问控制)的核心要素,提供了简洁而强大的权限管理解决方案。 ## 项目概述 Mini-RBAC旨在简化权限管理系统的实现,通过现代化的技术栈和清晰的架构设计,为开发者提供一个易于理解和集成的权限控制组件。项目采用前后端分离架构,后端使用FastAP

gitblog_00235的博客 794

AI: 机器学习的模型是如何训练的?(在试错中学习)

一句话理解机器学习一般训练过程 :通过有标签样本来调整(学习)并确定所有权重Weights和偏差Bias的理想值。 训练的目标:最小化损失函数 (损失函数下面马上会介绍) 机器学习算法在训练过程中,做的就是:检查多个样本并尝试找出可最大限度地减少损失的模型;目标就是将损失(Loss)最小化 在这里插入图片描述 上图就是一般模型训练的一般过程(试错过程),其中 模型: 将一个或多个特征作为输入,然后返回一个预测 (y’) 作为输出。为了进行简化,不妨考虑一种采用一个特征并返回一个预测的模型,如下公式

HowieXue 薛永浩的博客 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

揭秘FastAPI接口权限设计:如何用OAuth2+JWT实现细粒度访问控制

掌握FastAPI接口权限控制的实用方案,结合OAuth2与JWT实现安全细粒度访问管理,适用于多用户系统与微服务架构。具备高扩展性与灵活性,保障API安全的同时提升开发效率,值得收藏。

CompiTide的博客 1010

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程

源码见:"

mr~li的博客 702

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LangGraph+FastAPI工作流安全加固:认证与权限控制实战

AI工作流编排框架(如LangGraph)与高性能API服务(如FastAPI)的组合,正成为智能体系统的核心架构。但其天然的状态流转能力与开放调用接口,使认证缺失极易导致PII泄露、越权执行和租户隔离失效等高危风险。理解JWT自包含鉴权原理、configurable可信上下文注入机制及节点级RBAC控制逻辑,是构建可审计、可合规、可上线AI服务的技术基础。本文聚焦LangGraph工作流在FastAPI API网关下的分层安全实践,涵盖JWT解析中间件编写、SecureState状态沙箱设计、Condit

weixin_33701617的博客 344

从零搭建Python AI项目实战——FastAPI+SQLAIchemy+MySQL+Redis全流程详解,建议收藏!!

本项目核心包含认证与会话两大模块,各模块功能与技术实现如下: 认证模块提供完整的用户身份管理能力,涵盖注册、登录、退出及个人信息查询功能。在权限控制方面,采用统一身份管理架构,通过用户表与权限表实现精细化权限分配;登录机制结合 Redis 实现单点登录,确保用户身份的安全性与唯一性。 会话模块聚焦会话全生命周期管理与 AI 交互能力,具体包括:创建新聊天会话、获取当前用户的所有会话列表、删除指定会话、查询会话历史消息,以及基于豆包 AI 模型的长对话功能 —— 通过维护会话上下文,实现与 AI 的连贯交

Android23333的博客 1047

python 单点登录

前言   最近项目中小组负责开发的知识图谱子系统需要增加单点登录这个功能,由于我也是头一次开发这个,也请教了java后端大佬,再根据自己具体业务和使用的框架(fastapi)完成了任务,现在回过头来整理一下。   单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。在整个项目中,存在多个业务系统,也有独立登录系统,把授权的逻辑与用户信息的相关逻辑独立,由统一认证中心进行管理。因此

风吹半夏 4307

从零接触 FastAPI 框架,今日学习 day09

路径必须和实际登录接口完全一致,写错文档授权按钮无法使用。JWT payload 只存 user_id,不存 username;修改用户名不会造成 token 逻辑错乱,禁止存放密码。用户注册新增用户的时候,密码必须调用加密再入库,禁止明文存入数据库。时间一定要使用,本地时区会出现 token 时间错乱。JWT 本身无状态,不能主动让 token 失效,想要实现退出登录,就用到项目已有的,把失效 token 存入黑名单,就是 Day10 内容。SECRET_KEY。

zaohuanxiang的博客 203

SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——Vue3.0前后端分离架构——后台系统前端登录实现

【代码】SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——Vue3.0前后端分离架构——后台系统前端登录实现。

殷志鹏的博客 776

SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——Vue3.0前后端分离架构——后台系统前端权限管理模块实现

权限管理模块的前端实现

殷志鹏的博客 1164

FastAPI 基本介绍教程

本文全面介绍了FastAPI框架的核心概念、功能模块和最佳实践,主要包括以下内容: FastAPI基础 基于Starlette ASGI框架构建,提供高性能异步支持 特性:数据验证(Pydantic)、自动API文档、依赖注入系统 类型提示的三大作用:编辑器支持、数据转换、自动校验 核心功能 请求处理:路径参数、查询参数、请求体、表单、文件上传 响应模型:数据过滤、状态码控制、错误处理 安全机制:OAuth2、JWT认证、CORS配置 数据库集成:SQLModel关系型数据库操作示例 高级特性 依赖注入系统

weixin_60512458的博客 295

完整毕设项目(fastapi+js+dify工作流):智能风控新闻发布平台v1.0

前端(HTML/CSS/JS/axios/DOM/事件)+ 后端(FastAPI/ORM/MySQL/CRUD/跨域)+ Dify双工作流(创作辅助+风控审核)

2302_80664762的博客 967

FastAPI + OAuth2实战:手把手教你搭建企业级认证体系

掌握FastAPI的认证不再困难,本文详解如何基于OAuth2搭建安全可靠的企业级认证体系。涵盖JWT令牌管理、用户权限控制及实际应用场景,提供完整代码示例与最佳实践,助你快速实现高效、可扩展的认证方案,值得收藏。

ProceSeed的博客 662
上一篇: python json 自定义编码解码函数
下一篇: windows 图标变白
Leri_X
博客等级 码龄10年 26粉丝 56原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值