一个简单的基于角色的访问控制工具
项目描述
这是一个Python中的简单基于角色的访问控制工具。
快速入门
1. 安装Simple RBAC
pip install simple-rbac
2. 创建访问控制列表
import rbac.acl acl = rbac.acl.Registry()
3. 注册角色和资源
acl.add_role("member") acl.add_role("student", ["member"]) acl.add_role("teacher", ["member"]) acl.add_role("junior-student", ["student"]) acl.add_resource("course") acl.add_resource("senior-course", ["course"])
4. 添加规则
acl.allow("member", "view", "course") acl.allow("student", "learn", "course") acl.allow("teacher", "teach", "course") acl.deny("junior-student", "learn", "senior-course")
5. 使用它来检查权限
if acl.is_allowed("student", "view", "course"): print("Students chould view courses.") else: print("Students chould not view courses.") if acl.is_allowed("junior-student", "learn", "senior-course"): print("Junior students chould learn senior courses.") else: print("Junior students chould not learn senior courses.")
自定义角色和资源类
没有必要像“快速入门”一样使用字符串作为角色对象和资源对象。您可以定义自己的角色类和资源类,例如SQLAlchemy中的数据库映射模型。
无论您将使用哪种角色类和资源类,都必须实现 __hash__ 方法 和 __eq__ 方法,以便它是 可哈希的。
示例
class Role(db.Model): """The role.""" id = db.Column(db.Integer, primary_key=True) screen_name = db.Column(db.Unicode, nullable=False, unique=True) def __hash__(self): return hash("ROLE::%d" % self.id) def __eq__(self, other): return self.id == other.id class Resource(db.Model): """The resource.""" id = db.Column(db.Integer, primary_key=True) screen_name = db.Column(db.Unicode, nullable=False, unique=True) def __hash__(self): return hash("RESOURCE::%d" % self.id) def __eq__(self, other): return self.id == other.id
当然,您也可以使用内置的可哈希类型,例如元组、namedtuple、frozenset等。
使用身份上下文检查您的权限
显然,检查权限的工作是一个横切关注点。名为 rbac.context 的模块,我们的 IdentityContext,提供了一些使我们的工作更整洁的方法。
1. 创建上下文管理器
acl = Registry() context = IdentityContext(acl)
2. 设置加载器
加载器应该加载当前用户的角色。
from myapp import get_current_user @context.set_roles_loader def second_load_roles(): user = get_current_user() yield "everyone" for role in user.roles: yield str(role)
3. 保护您的操作
现在您可以保护您的操作免受未经授权的访问。您可以根据需要选择多种方式来检查权限,包括Python 装饰器、Python with语句 或简单的方法调用。
装饰器
@context.check_permission("view", "article", message="can't view") def article_page(): return "your-article"
with语句
def article_page(): with context.check_permission("view", "article", message="can't view"): return "your-article"
简单方法调用
def article_page(): context.check_permission("view", "article", message="can't view").check() return "your-article"
异常处理和非零检查
无论您选择哪种方式,当发生未经授权的访问时,将抛出一个异常 rbac.context.PermissionDenied。传递给 context.check_permission 的关键字参数将设置为异常的 kwargs 属性。您可以在异常处理程序中获取这些数据。
@context.check_permission("view", "article", message="can not view") def article_page(): return "your-article" try: print article_page() except PermissionDenied as exception: print "The access has been denied, you %s" % exception.kwargs['message']
如果您不想抛出异常,只想检查访问是否允许,可以使用类似布尔值的检查。
if not context.check_permission("view", "article"): print "Oh! the access has been denied." is_allowed = bool(context.check_permission("view", "article"))
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分布
simple-rbac-0.1.1.zip (11.9 kB 查看哈希值)
构建分布
simple-rbac-0.1.1.win-amd64.exe (236.2 kB 查看哈希值)
关闭
simple-rbac-0.1.1.zip的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e740e793fd4db759ad786ab6ec8b4e97fa0db43ca65f91e2570e2621044e3ad3 |
|
MD5 | 349c0e4a5941746aaf5ba4812ae773a1 |
|
BLAKE2b-256 | 19490ebe7834f85e781c4e0a1edbc99b444707dbe7d6e1789cd1fa99291481bd |
关闭
simple-rbac-0.1.1.win-amd64.exe的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d0489c11afc775a02f32a20b7e74c79f20ec217f725d739bdc2ff2a3f21699b8 |
|
MD5 | b5073b173e727734f019cc5afa8b8aaf |
|
BLAKE2b-256 | 24bdbe82023accf80e7a714a0b1107383c0eef2cd9ce33d128762178672403d1 |