一个简单的基于角色的访问控制实用程序

simple-rbac的Python项目详细描述


这是python中一个简单的基于角色的访问控制实用程序。

快速启动

一。安装简单的rbac

pip install simple-rbac

2.创建访问控制列表

import rbac.acl

acl = rbac.acl.Registry()

三。注册角色和资源

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"])

四。添加规则

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__方法实现为hashable

示例

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

当然,也可以使用内置的散列类型,比如tuple, 名为“双人”、“冰冻”等。

使用标识上下文检查您的权限

显然,检查许可证的工作是一个贯穿各领域的问题。 名为rbac.context的模块(我们的IdentityContext)提供了一些 使我们的工作更整洁的方法。

一。创建上下文管理器

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)

三。保护您的行动

现在您可以保护您的操作不受未经授权的访问。就像你一样 拜托,你可以选择多种方式来检查许可,包括 pythondecorator,pythonwith statement或简单方法 打电话。

装饰工
@context.check_permission("view", "article", message="can't view")
def article_page():
    return "your-article"

带有语句

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将被设置为名为 ^异常的{tt9}$。你可以在你的异常中得到这些数据 处理程序。

@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"))

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java什么数据库最类似于Map,每个用户/id存储无限多个“键”和“值”?   java仅使用super pom进行测试   内存不足如何解析java。OutOfMemoryError:Java堆空间在增加堆大小的情况下将意味着延迟OutOfMemoryError   来自另一个类的mysql和java jdbc调用[运行时应用程序]   java通过下拉菜单更改搜索框搜索的内容   JAVAlang.ClassNotFoundException:sun。jdbc。odbc。JdbcOdbcDriver   java Selenium点击链接   JavaSpringHibernate:从唯一值列表中获取对象列表   java Bing广告与桌面身份验证问题   java如何在没有任何外部SDK的情况下从安卓打印到收据打印机?   未调用java菜单片段类   java在IDEA和PyCharm中同时为同一个项目工作   java我们如何为同一个异常提供不同的海关信息   jakarta ee中是否预定义了“请求”和“响应”变量或值?   java更好地解决“之前和之后”难题?   尝试将数据从Excel添加到Java   发送电子邮件的Java代码只适用于一个电子邮件id?   java如何从资产解析XML?