为django的每个视图提供另一个访问控制列表(acl)
yaacl的Python项目详细描述
yaacl
==
为django每个视图提供另一个访问控制列表(acl)
在身份验证和管理应用程序
*将“import yaacl”放在当前设置文件的末尾
*运行`./manage.py syncdb``或`./manage.py migrate``
然后在
`settings.acl_group_user_model``(即:``cms_user.group``)
修饰完所有视图后,
运行命令`./manage.py sync_acl``,所有视图都将注册在
数据库中。
``python
从yaacl导入acl register_view
从django.contrib.auth.decorators导入login_required
@acl_register_view('short description about this view',“resource_name”)
def index(request):
pass
````
first parameter is``name``此视图(资源)的简称。第二个
参数是“resource”,不是必需的。如果“name=none`,
`` resource``未提供,则通过将
模块名和函数/类名
连接生成资源的名称,这取决于您如何命名这些资源,但我建议(并在我制作此应用程序的
项目中使用)将它们命名为“`<;app戋label>;<;view戋name>;`”,因此
稍后在模板中,您可以检查用户是否有权访问“`<;app戋label>;”“`
”中的所有资源,例如,您在新闻应用程序中有一个典型的crud视图,所以代码
应该是这样的:
`` python
从yaacl.decorators导入acl注册表视图
从django.contrib.auth.decorators导入登录所需
装饰基于标准函数的视图
@登录所需
@acl注册表视图('news list','news.create)
def index(request):
…
@acl_register_view('update news entry')
def update(request):
…
@login_required
@acl_register_view('delete news entry')
def delete(request):
…
新闻“
类创建(formview):
…
````
so,您的资源列表如下:
*``news.views.index``news list
*``news.create``create news
*``news.views.update``update news entry
*``news.views.delete``delete news entry
然后在
模板中,您可以使用如下代码检查它们:
``html
{%load acl%}
…
{%if request.user有权访问:'news.index%}
yes它有权访问news.index视图。
{%else%}
no,它没有。
{%endif%}
`````
``````html
{{%br/>{{%n如果有请求,用户有权访问:'news'%}
```html
```html
{%n如果有请求,用户有权访问:'news''%}
{%else%}
{%else%}
{%endif%}
`
``
`
;信号
实际上只有一个信号,`` yaacl.signals.register_resource``,在资源注册到``acl.acl_list``之前调用
。其目的是
转换“name”和/或“resource”。函数应该返回dict,其中包含
keys``name``和``resource`。
其中,我使用它从yaacl的resource name
``python
中删除“module”和“views”`
。从django的signals import register_resource
。dispatch import receiver
@receiver(register_resource)
def transform_resource(sender,resource,name,**Kwargs):
资源部件=资源。拆分('.')
源部件和资源部件[0]='模块':
资源部件.pop(0)
if len(资源部件)>;=2和资源部件[-2]='视图':
资源部件.pop(-2)
resource='..join(资源部件)
return{'resource':资源,“name”:name}
```
然后总是授予访问权限
*在“yaacl/no_access.html”文件中没有访问页模板
*在“has_access”模板标记中测试只是检查资源名称是否以
给定名称开头
todo
*`.travis.yml`
*一个标志,以指示工作人员具有完全访问权限的资源
==
为django每个视图提供另一个访问控制列表(acl)
在身份验证和管理应用程序
*将“import yaacl”放在当前设置文件的末尾
*运行`./manage.py syncdb``或`./manage.py migrate``
然后在
`settings.acl_group_user_model``(即:``cms_user.group``)
修饰完所有视图后,
运行命令`./manage.py sync_acl``,所有视图都将注册在
数据库中。
``python
从yaacl导入acl register_view
从django.contrib.auth.decorators导入login_required
def index(request):
pass
````
first parameter is``name``此视图(资源)的简称。第二个
参数是“resource”,不是必需的。如果“name=none`,
`` resource``未提供,则通过将
模块名和函数/类名
连接生成资源的名称,这取决于您如何命名这些资源,但我建议(并在我制作此应用程序的
项目中使用)将它们命名为“`<;app戋label>;<;view戋name>;`”,因此
稍后在模板中,您可以检查用户是否有权访问“`<;app戋label>;”“`
”中的所有资源,例如,您在新闻应用程序中有一个典型的crud视图,所以代码
应该是这样的:
`` python
从yaacl.decorators导入acl注册表视图
从django.contrib.auth.decorators导入登录所需
装饰基于标准函数的视图
@登录所需
@acl注册表视图('news list','news.create)
def index(request):
…
def update(request):
…
@login_required
@acl_register_view('delete news entry')
def delete(request):
…
新闻“
类创建(formview):
…
````
so,您的资源列表如下:
*``news.views.index``news list
*``news.create``create news
*``news.views.update``update news entry
*``news.views.delete``delete news entry
然后在
模板中,您可以使用如下代码检查它们:
``html
{%load acl%}
…
{%if request.user有权访问:'news.index%}
yes它有权访问news.index视图。
{%else%}
no,它没有。
{%endif%}
`````
``````html
{{%br/>{{%n如果有请求,用户有权访问:'news'%}
```html
```html
{%n如果有请求,用户有权访问:'news''%}
{%else%}
{%else%}
{%endif%}
`
``
`
;信号
实际上只有一个信号,`` yaacl.signals.register_resource``,在资源注册到``acl.acl_list``之前调用
。其目的是
转换“name”和/或“resource”。函数应该返回dict,其中包含
keys``name``和``resource`。
其中,我使用它从yaacl的resource name
``python
中删除“module”和“views”`
。从django的signals import register_resource
。dispatch import receiver
@receiver(register_resource)
def transform_resource(sender,resource,name,**Kwargs):
资源部件=资源。拆分('.')
源部件和资源部件[0]='模块':
资源部件.pop(0)
if len(资源部件)>;=2和资源部件[-2]='视图':
资源部件.pop(-2)
resource='..join(资源部件)
return{'resource':资源,“name”:name}
```
然后总是授予访问权限
*在“yaacl/no_access.html”文件中没有访问页模板
*在“has_access”模板标记中测试只是检查资源名称是否以
给定名称开头
todo
*`.travis.yml`
*一个标志,以指示工作人员具有完全访问权限的资源