策略库为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
策略库为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