简单的身份验证、授权和Flask的参数,强调可配置性
项目描述
FlaskSimpleAuth: 安全的Flask框架
FlaskSimpleAuth是一个Flask包装器,用于向带有认证、授权和参数管理的路由添加声明性安全层。
使用FlaskSimpleAuth,应用程序和安全关注点是分离的
- 应用程序关注于要做什么,并声明其安全需求。
- 配置声明如何通过提供设置和钩子函数来检查认证和授权约束。
- 框架在应用程序路由上实现和强制执行安全,提供安全默认设置,以确保安全不会被忽略。
以下Flask应用程序提供了两个路由
GET /store
允许任何在组 employee 中的认证 用户 访问商店列表。POST /store/<sid>
允许认证的 用户,如果是 store 编号 sid 的 manager,则可以向商店库存中添加产品数量。
# file "app.py"
from FlaskSimpleAuth import Flask
app = Flask("acme")
app.config.from_envvar("ACME_CONFIG")
@app.get("/store", authorize="employee")
def get_store(pattern: str = "%"):
# return the list of stores matching optional parameter pattern
return ..., 200
@app.post("/store/<sid>/product", authorize=("store", "sid", "manager"))
def post_store_sid_product(sid: int, product: str, quantity: int):
# product is added in quantity to store sid
return ..., 201
在这段代码中,没有关于用户如何认证的线索,因为这是从配置中设置的。在路由上只声明了必须的authorize
参数的权限。这些权限如何检查也是从配置中设置的。HTTP或JSON参数会自动转换为预期的类型,其功能与FastAPI相当。
认证和权限通过回调函数提供给框架。在我们的示例中,我们需要检索用户的盐化散列密码,以检查用户是否属于某个组,以及用户是否可以在特定角色中访问给定的商店。
# file "auth.py"
def get_user_pass(user: str) -> str|None:
return ... # hashed password retrieved from somewhere
def user_is_employee(user: str) -> bool:
return ... # whether user belongs to group employee
def store_perms(user: str, sid: int, role: str) -> bool|None:
return ... # whether user can access store sid in role
以下是上述应用的配置示例:用户可以通过JWT令牌或基本认证进行身份验证。
# file "acme.conf"
import os
import auth
FSA_MODE = "dev"
FSA_AUTH = ["token", "basic"]
FSA_TOKEN_TYPE = "jwt"
FSA_TOKEN_SECRET = os.environ["ACME_SECRET"]
FSA_GET_USER_PASS = auth.get_user_pass
FSA_GROUP_CHECK = { "employee": auth.user_is_employee }
FSA_OBJECT_PERMS = { "store": auth.store_perms }
框架将确保只有具有正确权限的认证用户才能调用路由。提供了安全和合理的默认值。大多数功能可以通过多个指令和钩子进行调整或扩展以满足特定需求。为了提高效率,认证和授权回调调用被缓存。此外,开箱即支持pydantic、dataclass和泛型类型参数。
更多
许可证
此代码属于公有领域。
所有软件都有错误,这是软件,因此……请注意,您可能会因此失去头发或朋友。如果您喜欢它,请随意给作者寄一张明信片。
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。
源分发
flasksimpleauth-33.1.tar.gz (46.5 kB 查看哈希)
构建分发
FlaskSimpleAuth-33.1-py3-none-any.whl (43.6 kB 查看哈希)