一个简单的基于角色的访问控制实用程序
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"))