一个简单的基于角色的访问控制工具
项目描述
这是一个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 |