Plone安全体系和工作流
Plone安全体系和工作流
http://www.315ok.org/blogfolder/389
http://www.315ok.org/logo.png
Plone安全体系和工作流
Plone安全体系和工作流
安全主体
Plone对象的属性、视图、操作等都通过指派权限来控制。
权限不直接指派到用户
权限被指派到角色
角色分为两大类,一个全局角色,一个本地角色。全局角色是全站范围有效,本地角色仅仅本地上下文有效
一个用户可以获得一个或多个角色
一个用户可以归属到多个用户组
角色可以指定到用户组,通常这种方式比角色指定到个人,要灵活
用户和用户组
Zope实例级别的用户和组在实例根目录下的acl_users文件夹下
Plone站点级别的用户和组在该站点根目录下的acl_users文件夹下
Plone站点的用户和组通过站点控制面板来管理
权限
权限的三大类别:
角色通过控制面板能够被指派到用户或者用户组,一个逻辑用户组可以被分配到多个角色。
内容对象通过“共享”tab获得指派本地角色的机会,完成灵活的权限控制。
通过程序来管理权限和角色的样例:
状态定义:包括该状态的id、title 、description以及能退出该状态的动作,还有最重要的是该状态下权限映射。
将权限指派到角色
工作流绑定和指派
工作流定义是独立于内容类型的,可以对系统中的任意内容类型指派和绑定工作流。
创建工作流的方法:
Plone对象的属性、视图、操作等都通过指派权限来控制。
权限不直接指派到用户
权限被指派到角色
角色分为两大类,一个全局角色,一个本地角色。全局角色是全站范围有效,本地角色仅仅本地上下文有效
一个用户可以获得一个或多个角色
一个用户可以归属到多个用户组
角色可以指定到用户组,通常这种方式比角色指定到个人,要灵活
用户和用户组
Zope实例级别的用户和组在实例根目录下的acl_users文件夹下
Plone站点级别的用户和组在该站点根目录下的acl_users文件夹下
Plone站点的用户和组通过站点控制面板来管理
权限
权限的三大类别:
- 和所有的内容类型相关,权限常量定义在 Products.CMFCore.permissions中,这些我们叫核心权限,他们通常情况下被工作流管理
- 创建特别的内容类型的权限,如 ATContentTypes: Add Image.这些通常定义在站点根级别,自动被子对象继承
- 控制站点范围策略的权限,如 Portlets: Manage portlets
角色通过控制面板能够被指派到用户或者用户组,一个逻辑用户组可以被分配到多个角色。
内容对象通过“共享”tab获得指派本地角色的机会,完成灵活的权限控制。
通过程序来管理权限和角色的样例:
from AccessControl import getSecurityManager
from Products.CMFCore.permissions import ModifyPortalContent
sm = getSecurityManager()
if sm.checkPermission(ModifyPortalContent, context):
# do something
将一个特别的权限指派到一系列的角色:context.manage_permission("Portlets: Manage portlets",
roles=['Manager', 'Site Administrator', 'Owner'], acquire=1)
判断当前用户是否匿名:from Products.CMFCore.utils import getToolByName
mtool = getToolByName(context, 'portal_membership')
if mtool.isAnonymousUser():
# do something
获取当前用户:member = mtool.getAuthenticatedMember()
if member is not None:
userId = member.getId()
提取用户属性:fullName = member.getProperty('fullname')
email = member.getProperty('email')
通过用户id 获取用户对象:adminUser = mtool.getMemberById('admin')通过工作流来强化控制- 覆盖继承的权限
- 阻止作者编辑已发布的内容
状态定义:包括该状态的id、title 、description以及能退出该状态的动作,还有最重要的是该状态下权限映射。
<state state_id="draft" title="Draft">
<description>Content is being drafted</description>
<exit-transition transition_id="publish"/>
<exit-transition transition_id="submit"/>
<permission-map name="Access contents information" acquired="False">
<permission-role>Contributor</permission-role>
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Site Administrator</permission-role>
<permission-role>Owner</permission-role>
<permission-role>Reader</permission-role>
<permission-role>StaffMember</permission-role>
</permission-map>
<permission-map name="Change portal events" acquired="False">
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Site Administrator</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="Modify portal content" acquired="False">
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Site Administrator</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="View" acquired="False">
<permission-role>Contributor</permission-role>
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Site Administrator</permission-role>
<permission-role>Owner</permission-role>
<permission-role>Reader</permission-role>
<permission-role>StaffMember</permission-role>
</permission-map>
</state>动作定义:包括该动作的id、title 、description以及执行该动作后下一目标状态,还有执行该动作的url,及该动作的要求的权限。 <transition transition_id="publish" title="Reviewer publishes content" new_state="published" trigger="USER" before_script="" after_script="">
<description>Publishing the item makes it visible to other users.</description>
<action url="%(content_url)s/content_status_modify?workflow_action=publish" category="workflow" icon="">Publish</action>
<guard>
<guard-permission>Review portal content</guard-permission>
</guard>
</transition>权限映射将权限指派到角色
工作流绑定和指派
工作流定义是独立于内容类型的,可以对系统中的任意内容类型指派和绑定工作流。
<?xml version="1.0"?>
<object name="portal_workflow">
<object name="optilux_sitecontent_workflow" meta_type="Workflow"/>
<bindings>
<default>
<bound-workflow workflow_id="optilux_sitecontent_workflow"/>
</default>
<type type_id="File" remove="remove" />
<type type_id="Image" remove="remove" />
<type type_id="Plone Site" />
</bindings>
</object>创建工作流的方法:
- 通过ZMI创建
- 通过GenericSetup模块导入工作流定义配置文件