Python permission authentication framework inspired by sa-token, with FastAPI integration
Project description
liteauth
Python 权限认证框架,源自 sa-token 的设计思想。
特性
- 登录/注销 — 单端/多端登录、同端互斥
- 踢人下线 — 按用户 ID 或 Token 精确踢出
- 权限/角色校验 — 通配符支持(
art.*→art.add) - Session 管理 — Account-Session(跨设备)/ Token-Session(单设备)
- 账号封禁 — 分类封禁 + 阶梯封禁
- 多账号体系 —
AuthLogic("user")/AuthLogic("admin")独立隔离 - SSO 单点登录 — 三种模式
- OAuth2.0 — 授权服务器(Authorization Code / Implicit / Client Credentials)
- JWT 模式 — 标准 / 无状态 / Mixin 三种模式
- FastAPI — 独立依赖函数、装饰器、中间件
- 可插拔存储 — 内存 / 磁盘(SQLite) / Redis
安装
pip install liteauth
# 可选依赖
pip install liteauth[fastapi] # FastAPI 集成
pip install liteauth[redis] # Redis 存储
pip install liteauth[jwt] # JWT 模式
pip install liteauth[crypto] # AES 加密
pip install liteauth[all] # 全部
快速开始
核心 API
from liteauth import AuthLogic, PermissionInterface, AuthManager
class MyPermission(PermissionInterface):
async def get_permission_list(self, login_id, login_type):
return {"admin": ["*"]}.get(login_id, ["user:view"])
async def get_role_list(self, login_id, login_type):
return {"admin": ["admin"]}.get(login_id, ["user"])
# 统一初始化(推荐在应用启动时调用一次)
AuthManager.init(
permission_interface=MyPermission(),
)
auth = AuthLogic()
await auth.login("admin")
FastAPI
from fastapi import FastAPI, Depends
from liteauth import AuthLogic, AuthManager
from liteauth.integration.fastapi import login_required, require_permission, register_exception_handlers
app = FastAPI()
AuthManager.init(
permission_interface=MyPermission(),
)
auth = AuthLogic()
AuthManager.register_auth(auth)
register_exception_handlers(app)
@app.post("/login")
async def login(username: str):
return await auth.login(username)
@app.get("/users/me")
async def me(user_id: str = Depends(login_required())):
return {"user_id": user_id}
@app.get("/admin")
async def admin(_: None = Depends(require_permission("admin:panel"))):
return {"msg": "welcome"}
装饰器
from liteauth.integration.fastapi.decorator import login_required, require_permission, require_role, ignore_auth
@router.get("/users")
@login_required
async def users(): ...
@router.get("/admin")
@require_permission("admin:panel")
async def admin(): ...
@router.get("/public")
@ignore_auth
async def public(): ...
JWT 无状态模式
from liteauth import JwtStatelessLogic, AuthConfig
auth = JwtStatelessLogic(config=AuthConfig(
jwt_secret="my-secret-key",
jwt_access_token_timeout=3600,
))
result = await auth.login("user123")
# → TokenResponse(access_token="eyJ...", refresh_token="eyJ...")
await auth.check_login() # 解码 JWT,不查数据库
new = await auth.refresh(result.refresh_token) # 刷新 Token
四种认证模式
JWT Simple
from liteauth import JwtSimpleLogic, AuthConfig
auth = JwtSimpleLogic(config=AuthConfig(jwt_secret="my-key"))
result = await auth.login("user123") # token 是 JWT
await auth.check_login() # 走 DAO 查询
await auth.kickout("user123") # 完整支持
对比
| 标准 | JWT Simple | JWT 无状态 | JWT Mixin | |
|---|---|---|---|---|
| Token 格式 | UUID | JWT | JWT | JWT |
| Token 校验 | DAO | DAO | JWT 解码 | JWT 解码 |
| 踢人下线 | ✅ | ✅ | ❌ | ❌ |
| Token-Session | ✅ | ✅ | ❌ | ✅ |
| 双 Token | — | — | ✅ | ✅ |
| get_extra() | ❌ | ✅ | ✅ | ✅ |
异常处理
一行注册,自动转换异常为 JSON 响应:
from liteauth.integration.fastapi import register_exception_handlers
register_exception_handlers(app)
| 异常 | HTTP | 响应示例 |
|---|---|---|
NotLoginException |
401 | {"detail":"已被踢下线","code":"NOT_LOGIN","scene":"-5"} |
NotPermissionException |
403 | {"detail":"无此权限","code":"PERMISSION_DENIED","permission":"admin:panel"} |
NotRoleException |
403 | {"detail":"无此角色","code":"ROLE_DENIED","role":"admin"} |
DisableServiceException |
403 | {"detail":"账号已被封禁","code":"DISABLE"} |
存储后端
# 内存(默认,开发/测试)
from liteauth import MemoryDao
dao = MemoryDao(size=100_000)
# 磁盘持久化(SQLite,单机生产)
from liteauth.dao.disk import DiskDao
dao = DiskDao(directory="./auth_cache")
# Redis(分布式生产)
from liteauth import RedisDao
dao = RedisDao.from_url("redis://localhost:6379/0")
# 使用
auth = AuthLogic(dao=dao)
多账号体系
user_auth = AuthLogic(login_type="user")
admin_auth = AuthLogic(login_type="admin")
AuthManager.register_auth(user_auth)
AuthManager.register_auth(admin_auth)
# FastAPI
@app.get("/admin")
async def admin(_: None = Depends(require_permission("admin:panel", login_type="admin"))):
...
高级特性
SSO 单点登录
from liteauth.sso import SsoConfig, SsoRouter, SsoClient
router = SsoRouter(SsoConfig(server_url="http://auth.example.com"))
app.include_router(router.get_router(), prefix="/sso")
client = SsoClient(auth, config=sso_config)
OAuth2.0
from liteauth.oauth2 import OAuth2Config, OAuth2Client, OAuth2Router
# FastAPI 路由
router = OAuth2Router(OAuth2Config(server_url="http://localhost:8000"))
app.include_router(router.get_router(), prefix="/oauth2")
# Flask 用户可直接使用 OAuth2Template + 自定义路由
template = OAuth2Template(config)
await template.authorize(client_id="app1", response_type="code", user_id="123")
临时 Token
from liteauth import TempTokenUtil
token = TempTokenUtil.create_token("user@example.com", timeout=300, secret="key")
value = TempTokenUtil.parse_token(token, secret="key") # → "user@example.com"
二级认证
await auth.open_safe(service="payment", timeout=120) # 开启
await auth.check_safe(service="payment") # 校验
await auth.close_safe(service="payment") # 关闭
依赖
| 模块 | 依赖 |
|---|---|
| 核心 | pydantic>=2.0, cashews>=7.5 |
| FastAPI | fastapi>=0.139 |
| Redis | redis>=8.0 |
| JWT | pyjwt>=2.13 |
| Crypto | cryptography>=49.0 |
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
liteauth-0.2.11.tar.gz
(6.9 MB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
liteauth-0.2.11-py3-none-any.whl
(91.4 kB
view details)
File details
Details for the file liteauth-0.2.11.tar.gz.
File metadata
- Download URL: liteauth-0.2.11.tar.gz
- Upload date:
- Size: 6.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b60b2bb182ec6fc14840a3cc7c3b3ea37d593078d205099cf547e2af71fdf245
|
|
| MD5 |
1449d7c1ed44b9f4bbad2251d7436074
|
|
| BLAKE2b-256 |
5e4870a525eda64840a5e515223d641df23eb0ab72934b26eddaa10242b1b4e4
|
File details
Details for the file liteauth-0.2.11-py3-none-any.whl.
File metadata
- Download URL: liteauth-0.2.11-py3-none-any.whl
- Upload date:
- Size: 91.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
edf51a0d67c6a7125b33fbfd16b4896c93bc3f6686c509409a0281c6b314b920
|
|
| MD5 |
a799459e0d99b29fe4a22b820a90e7c9
|
|
| BLAKE2b-256 |
fde6373ee3a3eeae99e13f82bcd18694aafb53880b6165a7bea849677a1266ff
|