策略库为rbac策略实施提供支持。

polic的Python项目详细描述


#policy
策略库为rbac策略实施提供支持。



preface

因为我非常喜欢基于策略文件的"openstack"服务的权限控制方法。因此,我想实现一个类似于"oslo.policy"的更通用的库。



\demo

\generate policy file

我们有3个策略:

-只有用户可以更新文章
-创建新用户需要管理员权限。
-只有文章所有者或管理员角色用户可以删除文章。

基于前面的描述,我们生成以下策略文件"policy.json":

{
"is_admin":"role:admin"、
"is_user":"role:user或role:admin"、

"article:update":"rule:is_user"、
"article:delete":"role:admin或id:%(user_id)s"、
"user:create":"rule:is_admin"



/>假设我们有一个简单的"flask"应用程序,它提供两个api:创建新用户和删除文章,然后我们运行它:

```
!!/usr/bin/env python
-*-编码:utf-8-*
import functools

r/>
@app.errorhandler(policynotauthorized)
def handle\u policy异常(错误):
return str(错误)



users={
'lily':{
'id':'d55a4192eb3b4895589d5ee95dcf3af7d',
'roles':['user','admin']
'kate':{
'id':'1a5353099687244E2AA434B25EF4BB59’,
'roles':['user']
},
'lucy':{
'id':'186977181E7F4A9E85104CA017E845F3',
'lucy':['user']




articles={
'python':{
'id':'ee31aD690734B2494949B24949B2494949B2B2CB800',
'lucy':{
'roles':['user'['user']






"用户ID":"1a535309687244e2aa434b25ef4bfb59"归Kate所有
}





def login\u required(func):
@functools.wrapps(func)
def wrapped(*args,**kwargs):
username=request.args.get('me')
credential=users.get(username)
凭据:
引发异常("需要登录")
其他:
g.cred=credential
return func(*args,**kwargs)


return wrapped



def enforce_policy(rule):
"对api强制策略。"
def wrapper(func):
"decorator用于包装api。""
@functools.wrapps(func)
def wrapped(*args,**kwargs):
如果强制执行(rule,{},g.cred):
return func(*args,**kwargs)




return wrapper


@app.route('/user',methods=['get'])
@需要登录
@强制策略('user:create')
定义创建用户():
在此处执行创建操作
返回"用户创建"



@app.route('/article',methods=['get'])
@需要登录
定义删除文章():
文章名=request.args.get('name')
article=article s.get(articles廑name)

ain_uu':
app.run(port=8888,debug=true)
````

````enforce___view level

me=kate来模拟"kate"正在创建的用户并得到一个错误:

user:create on{}by{roles':['user','id':'1a535309687244e2aa434b25ef4bfb59'}策略不允许

,然后我们转到http://127.0.0.1:8888/user?me=lily模拟"lily"创建用户并获得成功的响应:

user created


我们在视图"delete\article"中执行策略,因为在视图外部,我们不知道用户要删除哪一篇文章。

我们转到http://127.0.0.1:8888/article?me=lucy&name=python以模拟"lucy"删除项目并获取错误:

article:delete on{user-id':'1a535309687244e2aa434b25ef4bf59','id':'e6e1ad693734b269099d9acac2cb800'}by{roles':['user','id':'186977181e7f4a9e85104ca017e845f3'}策略不允许我们可以访问http://127.0.0.1:8888/文章吗?me=kate&name=python来模拟"kate"删除文章并获得成功的响应,因为"kate"是文章的所有者:

arcticle e6e31ad693734b269099d9acac2cb800 deleted

最后我们转到http://127.0.0.1:8888/article?me=lily&;name=python以模拟"lily"删除文章并获得成功响应,因为"lily"是管理员角色用户:

arcticle e6e31ad693734b269099d9acac2cb800 deleted



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

推荐PyPI第三方库


热门话题
java需要设置框架。可设置大小(false)以重新绘制()   java我对PDF文件感到困惑   为什么是太阳。jvm。热点。调试器。DebuggerException:无法打开二进制文件`?   设置结果为textview时出现java空指针异常   我应该使用什么同步原语在Java中实现事件驱动程序框架?   java为什么WindowClosing处理程序在退出程序之前不执行后台任务?   如何将“20170712T18:43:04.000Z”转换为安卓或java中的相对时间?   Java,获取按键的时间长度,currentTimeMillies()始终为24   maven构建的java可执行Jar找不到logback。xml   java在其外部的函数中使用for循环中的值   java如何以表格格式将不同长度的数据对齐   java Play 2.5 WebSocket连接构建   maven而非eclipse的java强制转换问题   java如何在JFreeChart中使X轴上的值水平?   构建Java Windows应用程序以访问在线MySQL数据库需要什么   java添加构造函数会出错吗?这没有道理,请帮忙,编程问题   java在一个jframe中的两个JPanel中使用两个绘制方法   java数学或逻辑问题   java如何复制Androids库存摄像头方向更改