跳转到主要内容

一个简单的基于角色的访问控制工具

项目描述

这是一个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 查看哈希值)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面