Plone安全体系和工作流

Plone安全体系和工作流
安全主体
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模块导入工作流定义配置文件
(……未完待续……)



设置