用于管理 Python 3.7+ 项目中的权限的库
项目描述
否定
用于管理 Python 3.7+ 项目中的权限的库。
例如,它可用于根据您定义的策略授予对某些 API 端点的访问权限。
安装
pip install deny
用法
首先定义项目所需的权限:
from deny import AutoPermission, Permission
class ProfilePermissions:
view = Permission(name="view_project")
edit = AutoPermission() # name will be automatically set to "ProjectPermissions.edit"
class SessionPermissions:
create = AutoPermission()
delete = AutoPermission()
然后创建将用于授予权限的策略:
from deny import Policy, authorize
class LoggedInUser:
@authorize(SessionPermissions.delete)
async def can_logout(self):
return True
class AnonymousUser(Policy):
@authorize(SessionPermissions.create)
async def can_logout(self):
return True
class UserPolicy(LoggedInUser, Policy):
def __init__(self, current_user_id: int):
"""You should inject any dependency this policy relies on.
Here we just save the current user ID, but you might need
a connection to a database, a whole user object, etc.
"""
self._current_user_id = current_user_id
@authorize(ProfilePermissions.edit)
async def can_edit_profile(self, user_id: int) -> bool:
"""Only current user can edit his own profile."""
return self._current_user_id == user_id
@authorize(ProfilePermissions.view)
async def can_view_profile(self, user_id: int) -> bool:
"""Everybody can view the user profiles."""
return True
最后创建一个具有正确策略的能力并检查是否授予权限:
from deny import Ability
def get_ability(current_user_id: Optional[int]) -> Ability:
if current_user_id:
policy = UserPolicy(current_user_id)
else:
policy = AnonymousUser()
return Ability(policy=policy)
################
# Logged in user
ability = get_ability(1)
await ability.can(ProfilePermissions.view, 1) # True
await ability.can(ProfilePermissions.view, 2) # True
await ability.can(ProfilePermissions.edit, 1) # True
await ability.authorize(ProfilePermissions.edit, 1) # does not throw any error
await ability.can(ProfilePermissions.edit, 2) # False
await ability.authorize(ProfilePermissions.edit, 2) # throw an UnauthorizedError
await ability.can(SessionPermission.create) # False
await ability.can(ProfilePermissions.delete) # True
################
# Anonymous user
ability = get_ability(None)
await ability.can(ProfilePermissions.view, 1) # False
await ability.can(ProfilePermissions.view, 2) # False
await ability.can(ProfilePermissions.edit, 1) # False
await ability.authorize(ProfilePermissions.edit, 1) # throw an UnauthorizedError
await ability.can(ProfilePermissions.edit, 2) # False
await ability.authorize(ProfilePermissions.edit, 2) # throw an UnauthorizedError
await ability.can(SessionPermission.create) # True
await ability.can(ProfilePermissions.delete) # False
你可以在examples/usage.py中看到完整的例子(你需要asyncio运行它,pip install asyncio)
网络框架
Deny 可用于任何 Web 框架。
但它带有一些用于Falcon、Sanic、FastAPI和Flask的辅助函数。
以下是Sanic Web 框架的示例:
from sanic import Sanic
from sanic.request import Request
from sanic.response import HTTPResponse, json
from deny import Ability, AutoPermission, Policy, authorize as policy_authorize
from deny.errors import UnauthorizedError
from deny.ext.sanic import authorize
class ProjectPermissions:
view = AutoPermission()
class UserPolicy(Policy):
@authorize(ProjectPermissions.view)
async def can_view_project(self, request: Request, id: int) -> bool:
return id == 1
app = Sanic("example")
@app.middleware("request")
async def inject_ability(request: Request) -> None:
request.ctx.ability = Ability(policy=UserPolicy())
@app.get("/projects/<id:int>")
@authorize(ProjectPermissions.view)
async def get(request: Request, id: int) -> HTTPResponse:
return json({"id": id})
@app.exception(UnauthorizedError)
async def unauthorized_handler(request: Request, exc: Exception):
return json({"error": str(exc)}, status=403)
您可以在此存储库的示例/文件夹中找到每个框架的示例。
同步支持
默认情况下,提供的所有类deny都构建为在异步环境中运行。
如果您在同步环境中运行(没有async, await),则导入 fromdeny.sync而不是deny.
有关完整示例,请参见示例/sync.py。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
deny-0.1.1a2.tar.gz
(9.7 kB
查看哈希)
内置分布
deny-0.1.1a2-py3-none-any.whl
(13.4 kB
查看哈希)
关
deny- 0.1.1a2 -py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 7aaebbedb80638da2292fb8f05031d636a65c06a65221d5a7d068fc04deaef3f |
|
| MD5 | b7271d67fe2d082473e55d99a618c752 |
|
| 布莱克2-256 | 1199aababe24088701f43521d9ba75026762bca6374976d74537aee4e8c843c3 |