Skip to content

Commit dab038e

Browse files
committed
docs: Add Chinese language readme.md
1 parent 8759e49 commit dab038e

File tree

2 files changed

+357
-0
lines changed

2 files changed

+357
-0
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
[简体中文](https://github.com/amisadmin/fastapi_user_auth/blob/master/README.zh.md)
2+
| [English](https://github.com/amisadmin/fastapi_user_auth)
3+
14
# Project Introduction
25

36
<h2 align="center">

README.zh.md

Lines changed: 354 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,354 @@
1+
[简体中文](https://github.com/amisadmin/fastapi_user_auth/blob/master/README.zh.md)
2+
| [English](https://github.com/amisadmin/fastapi_user_auth)
3+
4+
# 项目介绍
5+
6+
<h2 align="center">
7+
FastAPI-User-Auth
8+
</h2>
9+
<p align="center">
10+
<em>FastAPI-User-Auth是一个简单而强大的FastAPI用户RBAC认证与授权库.</em><br/>
11+
<em>基于FastAPI-Amis-Admin并提供可自由拓展的可视化管理界面.</em>
12+
</p>
13+
<p align="center">
14+
<a href="https://github.com/amisadmin/fastapi_amis_admin/actions/workflows/pytest.yml" target="_blank">
15+
<img src="https://github.com/amisadmin/fastapi_amis_admin/actions/workflows/pytest.yml/badge.svg" alt="Pytest">
16+
</a>
17+
<a href="https://pypi.org/project/fastapi_user_auth" target="_blank">
18+
<img src="https://badgen.net/pypi/v/fastapi-user-auth?color=blue" alt="Package version">
19+
</a>
20+
<a href="https://pepy.tech/project/fastapi-user-auth" target="_blank">
21+
<img src="https://pepy.tech/badge/fastapi-user-auth" alt="Downloads">
22+
</a>
23+
<a href="https://gitter.im/amisadmin/fastapi-amis-admin">
24+
<img src="https://badges.gitter.im/amisadmin/fastapi-amis-admin.svg" alt="Chat on Gitter"/>
25+
</a>
26+
<a href="https://jq.qq.com/?_wv=1027&k=U4Dv6x8W" target="_blank">
27+
<img src="https://badgen.net/badge/qq%E7%BE%A4/229036692/orange" alt="229036692">
28+
</a>
29+
</p>
30+
<p align="center">
31+
<a href="https://github.com/amisadmin/fastapi_user_auth" target="_blank">源码</a>
32+
·
33+
<a href="http://user-auth.demo.amis.work/" target="_blank">在线演示</a>
34+
·
35+
<a href="http://docs.amis.work" target="_blank">文档</a>
36+
·
37+
<a href="http://docs.gh.amis.work" target="_blank">文档打不开?</a>
38+
</p>
39+
40+
------
41+
42+
`FastAPI-User-Auth`是一个基于 [FastAPI-Amis-Admin](https://github.com/amisadmin/fastapi_amis_admin)
43+
的应用插件,与`FastAPI-Amis-Admin`深度结合,为其提供用户认证与授权.
44+
45+
## 安装
46+
47+
```bash
48+
pip install fastapi-user-auth
49+
```
50+
51+
## 简单示例
52+
53+
```python
54+
from fastapi import FastAPI
55+
from fastapi_amis_admin.admin.settings import Settings
56+
from fastapi_user_auth.site import AuthAdminSite
57+
from starlette.requests import Request
58+
from sqlmodel import SQLModel
59+
60+
# 创建FastAPI应用
61+
app = FastAPI()
62+
63+
# 创建AdminSite实例
64+
site = AuthAdminSite(settings=Settings(database_url_async='sqlite+aiosqlite:///amisadmin.db'))
65+
auth = site.auth
66+
# 挂载后台管理系统
67+
site.mount_app(app)
68+
69+
# 创建初始化数据库表
70+
@app.on_event("startup")
71+
async def startup():
72+
await site.db.async_run_sync(SQLModel.metadata.create_all, is_session=False)
73+
# 创建默认测试用户, 请及时修改密码!!!
74+
await auth.create_role_user('admin')
75+
await auth.create_role_user('vip')
76+
77+
# 要求: 用户必须登录
78+
@app.get("/auth/get_user")
79+
@auth.requires()
80+
def get_user(request: Request):
81+
return request.user
82+
83+
if __name__ == '__main__':
84+
import uvicorn
85+
86+
uvicorn.run(app, debug=True)
87+
88+
```
89+
90+
## 验证方式
91+
92+
### 装饰器
93+
94+
- 推荐场景: 单个路由.支持同步/异步路由.
95+
96+
```python
97+
# 要求: 用户必须登录
98+
@app.get("/auth/user")
99+
@auth.requires()
100+
def user(request: Request):
101+
return request.user # 当前请求用户对象.
102+
103+
# 验证路由: 用户拥有admin角色
104+
@app.get("/auth/admin_roles")
105+
@auth.requires('admin')
106+
def admin_roles(request: Request):
107+
return request.user
108+
109+
# 要求: 用户拥有vip角色
110+
# 支持同步/异步路由
111+
@app.get("/auth/vip_roles")
112+
@auth.requires(['vip'])
113+
async def vip_roles(request: Request):
114+
return request.user
115+
116+
# 要求: 用户拥有admin角色 或 vip角色
117+
@app.get("/auth/admin_or_vip_roles")
118+
@auth.requires(roles=['admin', 'vip'])
119+
def admin_or_vip_roles(request: Request):
120+
return request.user
121+
122+
# 要求: 用户属于admin用户组
123+
@app.get("/auth/admin_groups")
124+
@auth.requires(groups=['admin'])
125+
def admin_groups(request: Request):
126+
return request.user
127+
128+
# 要求: 用户拥有admin角色 且 属于admin用户组
129+
@app.get("/auth/admin_roles_and_admin_groups")
130+
@auth.requires(roles=['admin'], groups=['admin'])
131+
def admin_roles_and_admin_groups(request: Request):
132+
return request.user
133+
134+
# 要求: 用户拥有vip角色 且 拥有`article:update`权限
135+
@app.get("/auth/vip_roles_and_article_update")
136+
@auth.requires(roles=['vip'], permissions=['article:update'])
137+
def vip_roles_and_article_update(request: Request):
138+
return request.user
139+
140+
```
141+
142+
### 依赖项(推荐)
143+
144+
- 推荐场景: 单个路由,路由集合,FastAPI应用.
145+
146+
```python
147+
from fastapi import Depends
148+
from typing import Tuple
149+
from fastapi_user_auth.auth import Auth
150+
from fastapi_user_auth.auth.models import User
151+
152+
# 路由参数依赖项, 推荐使用此方式
153+
@app.get("/auth/admin_roles_depend_1")
154+
def admin_roles(user: User = Depends(auth.get_current_user)):
155+
return user # or request.user
156+
157+
# 路径操作装饰器依赖项
158+
@app.get("/auth/admin_roles_depend_2", dependencies=[Depends(auth.requires('admin')())])
159+
def admin_roles(request: Request):
160+
return request.user
161+
162+
# 全局依赖项
163+
# 在app应用下全部请求都要求拥有admin角色
164+
app = FastAPI(dependencies=[Depends(auth.requires('admin')())])
165+
166+
@app.get("/auth/admin_roles_depend_3")
167+
def admin_roles(request: Request):
168+
return request.user
169+
170+
```
171+
172+
### 中间件
173+
174+
- 推荐场景: FastAPI应用
175+
176+
```python
177+
app = FastAPI()
178+
# 在app应用下每条请求处理之前都附加`request.auth`和`request.user`对象
179+
auth.backend.attach_middleware(app)
180+
181+
```
182+
183+
### 直接调用
184+
185+
- 推荐场景: 非路由方法
186+
187+
```python
188+
from fastapi_user_auth.auth.models import User
189+
190+
async def get_request_user(request: Request) -> Optional[User]:
191+
# user= await auth.get_current_user(request)
192+
if await auth.requires('admin', response=False)(request):
193+
return request.user
194+
else:
195+
return None
196+
197+
```
198+
199+
## Token存储后端
200+
201+
`fastapi-user-auth` 支持多种token存储方式.默认为: `DbTokenStore`, 建议自定义修改为: `JwtTokenStore`
202+
203+
### JwtTokenStore
204+
205+
```python
206+
from fastapi_user_auth.auth.backends.jwt import JwtTokenStore
207+
from sqlalchemy.ext.asyncio import create_async_engine
208+
from sqlalchemy_database import AsyncDatabase
209+
210+
# 创建异步数据库引擎
211+
engine = create_async_engine(url='sqlite+aiosqlite:///amisadmin.db', future=True)
212+
# 使用`JwtTokenStore`创建auth对象
213+
auth = Auth(
214+
db=AsyncDatabase(engine),
215+
token_store=JwtTokenStore(secret_key='09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7')
216+
)
217+
218+
# 将auth对象传入AdminSite
219+
site = AuthAdminSite(
220+
settings=Settings(database_url_async='sqlite+aiosqlite:///amisadmin.db'),
221+
auth=auth
222+
)
223+
224+
```
225+
226+
### DbTokenStore
227+
228+
```python
229+
# 使用`DbTokenStore`创建auth对象
230+
from fastapi_user_auth.auth.backends.db import DbTokenStore
231+
232+
auth = Auth(
233+
db=AsyncDatabase(engine),
234+
token_store=DbTokenStore(db=AsyncDatabase(engine))
235+
)
236+
```
237+
238+
### RedisTokenStore
239+
240+
```python
241+
# 使用`RedisTokenStore`创建auth对象
242+
from fastapi_user_auth.auth.backends.redis import RedisTokenStore
243+
from aioredis import Redis
244+
245+
auth = Auth(
246+
db=AsyncDatabase(engine),
247+
token_store=RedisTokenStore(redis=Redis.from_url('redis://localhost?db=0'))
248+
)
249+
```
250+
251+
## RBAC模型
252+
253+
本系统采用的`RBAC`模型如下, 你也可以根据自己的需求进行拓展.
254+
255+
- 参考: [权限系统的设计](https://blog.csdn.net/qq_25889465/article/details/98473611)
256+
257+
```mermaid
258+
flowchart LR
259+
User -. m:n .-> Group
260+
User -. m:n .-> Role
261+
Group -. m:n .-> Role
262+
Role -. m:n .-> Perimission
263+
```
264+
265+
## 高级拓展
266+
267+
```bash
268+
### 拓展`User`模型
269+
270+
```python
271+
from datetime import date
272+
273+
from fastapi_amis_admin.models.fields import Field
274+
from fastapi_user_auth.auth.models import User
275+
276+
# 自定义`User`模型,继承`User`
277+
class MyUser(User, table = True):
278+
point: float = Field(default = 0, title = '积分', description = '用户积分')
279+
phone: str = Field(None, title = '手机号', max_length = 15)
280+
parent_id: int = Field(None, title = "上级", foreign_key = "auth_user.id")
281+
birthday: date = Field(None, title = "出生日期")
282+
location: str = Field(None, title = "位置")
283+
284+
# 使用自定义的`User`模型,创建auth对象
285+
auth = Auth(db = AsyncDatabase(engine), user_model = MyUser)
286+
```
287+
288+
### 拓展`Role`,`Group`,`Permission`模型
289+
290+
```python
291+
from fastapi_amis_admin.models.fields import Field
292+
from fastapi_user_auth.auth.models import Group
293+
294+
# 自定义`Group`模型,继承`BaseRBAC`;覆盖`Role`,`Permission`模型类似,区别在于表名.
295+
class MyGroup(Group, table=True):
296+
__tablename__ = 'auth_group' # 数据库表名,必须是这个才能覆盖默认模型
297+
icon: str = Field(None, title='图标')
298+
is_active: bool = Field(default=True, title="是否激活")
299+
300+
```
301+
302+
### 自定义`UserAuthApp`默认管理类
303+
304+
默认管理类均可通过继承重写替换.
305+
例如: `UserLoginFormAdmin`,`UserRegFormAdmin`,`UserInfoFormAdmin`,
306+
`UserAdmin`,`GroupAdmin`,`RoleAdmin`,`PermissionAdmin`
307+
308+
```python
309+
# 自定义模型管理类,继承重写对应的默认管理类
310+
class MyGroupAdmin(admin.ModelAdmin):
311+
group_schema = None
312+
page_schema = PageSchema(label='用户组管理', icon='fa fa-group')
313+
model = MyGroup
314+
link_model_fields = [Group.roles]
315+
readonly_fields = ['key']
316+
317+
# 自定义用户认证应用,继承重写默认的用户认证应用
318+
class MyUserAuthApp(UserAuthApp):
319+
GroupAdmin = MyGroupAdmin
320+
321+
# 自定义用户管理站点,继承重写默认的用户管理站点
322+
class MyAuthAdminSite(AuthAdminSite):
323+
UserAuthApp = MyUserAuthApp
324+
325+
# 使用自定义的`AuthAdminSite`类,创建site对象
326+
site = MyAuthAdminSite(settings, auth=auth)
327+
```
328+
329+
## 界面预览
330+
331+
- Open `http://127.0.0.1:8000/admin/auth/form/login` in your browser:
332+
333+
![Login](https://s2.loli.net/2022/03/20/SZy6sjaVlBT8gin.png)
334+
335+
- Open `http://127.0.0.1:8000/admin/` in your browser:
336+
337+
![ModelAdmin](https://s2.loli.net/2022/03/20/ItgFYGUONm1jCz5.png)
338+
339+
- Open `http://127.0.0.1:8000/admin/docs` in your browser:
340+
341+
![Docs](https://s2.loli.net/2022/03/20/1GcCiPdmXayxrbH.png)
342+
343+
## 许可协议
344+
345+
- `fastapi-amis-admin`基于`Apache2.0`开源免费使用,可以免费用于商业用途,但请在展示界面中明确显示关于FastAPI-Amis-Admin的版权信息.
346+
347+
## 鸣谢
348+
349+
感谢以下开发者对 FastAPI-User-Auth 作出的贡献:
350+
351+
<a href="https://github.com/amisadmin/fastapi_user_auth/graphs/contributors">
352+
<img src="https://contrib.rocks/image?repo=amisadmin/fastapi_user_auth" alt=""/>
353+
</a>
354+

0 commit comments

Comments
 (0)