如何在Python API的depends方法中添加request+附加属性进行授权

问题描述 投票:0回答:1

我们正在尝试根据用户的角色和权限授权 API,有方法可以根据用户的角色和他尝试访问的内容进行检查

   
def check_permission(request: Request , permission:str=""):
  role=request.state.role
  if role not in cache:
        cache[role] = role_service.get_permission_by_role(role)
  permission_list=cache[role]
  index=permission_list.find(permission)
  return index > -1
  

& API 中

@router.post('/banners',dependencies=[Depends(check_permission(permission=PermissionCodes.ADD_SITE_CONTENT))])
def add_banner(request:Request,file: UploadFile = File(...)):

但它没有显式传递请求参数并抛出异常 TypeError: check_permission() 缺少 1 个必需的位置参数: 'request'

如何在 check_permission 方法中传递请求+permission_code?

  1. 请求:Request=Depends() 尝试过但没有成功
  2. 在方法参数中明确提及
python fastapi rbac
1个回答
0
投票

原因是您正在调用 check_permission,您没有将函数本身添加为依赖项 - 只是添加它返回的内容。您想要从

check_permission
返回一个函数,该函数又将
request: Request
作为其参数之一:

from fastapi import Depends, FastAPI, Request

app = FastAPI()


def check_permission(permission: str):
    def permission_checker(request: Request):
        print(request)
        return permission
        
    return permission_checker


@app.get("/", dependencies=[Depends(check_permission("admin"))])
async def read_items():
    return "foo"

输出:

INFO:     Application startup complete.
<starlette.requests.Request object at 0x000001FE03554FD0>
INFO:     127.0.0.1:54114 - "GET / HTTP/1.1" 200 OK
© www.soinside.com 2019 - 2024. All rights reserved.