跳转到主要内容

在Plone中定义动态用户组的另一种方式。

项目描述

概述

Products.PluggableAuthService提供了一个“动态组插件”。您可以添加“虚拟”组,并为每个组通过一个TALES表达式定义的谓词来建立成员资格。

此包旨在提供类似的功能,但采用不同的方式。一旦安装了“Another Dynamic Groups Plugin”,它将查找已注册的组提供者(技术上这些是针对用户和请求的多适配器)。每个组提供者将提供一组用户所属的组。它与borg.localrole类似,但用于组。

提供的插件也是一个“组内省插件”。这意味着创建的“虚拟”组在Plone管理UI中显示为组。实际上,如果我们不这样做,@@usergroup-userprefs视图会损坏。

兼容性

当前版本已在Plone 4.3上进行测试。它可能适用于4.x系列中的任何版本。

安装

通常:使包在buildout中可用并加载其ZCML。然后您可以将它作为Plone插件安装到Plone站点中。

使用

一旦安装了插件,您就可以添加“虚拟”组。这些将是插件动态分配给用户的组。这也可以通过ZMI完成

>>> from collective.anotherdynamicgroupsplugin.util import add_virtual_group
>>> add_virtual_group(group_id='group1', title='Group 1')
>>> add_virtual_group(group_id='group2', title='Group 2')

我们还将添加一个常规组,因为组提供者也可以将用户分配到这些组中

>>> from plone import api
>>> api.group.create(groupname='group3', title='Group 3')
<GroupData ...

添加一些用户

>>> for u_id in ('user1', 'user2', 'user3'):
...     api.user.create(username=u_id, email=u_id + '@test.org')
<MemberData ...
<MemberData ...
<MemberData ...

现在我们创建和注册命名适配器。第一个适配器使每个人都成为“group1”的成员

>>> from collective.anotherdynamicgroupsplugin.interfaces import IGroupProvider
>>> from zope.component import provideAdapter
>>> from zope.interface import implements
>>> from zope.publisher.interfaces.http import IHTTPRequest
>>> from Products.PluggableAuthService.interfaces.authservice import IBasicUser
>>> class ProvideGroup1ToAll(object):
...     implements(IGroupProvider)
...     def __init__(self, user, request):
...         self.user = user
...         self.request = request
...     def __call__(self):
...         return ['group1']
>>> provideAdapter(
...     ProvideGroup1ToAll,
...     adapts=(IBasicUser, IHTTPRequest),
...     name=ProvideGroup1ToAll.__name__
... )

第二个适配器使用户成为具有相应名称的组成员

>>> class ProvideCorrespondentGroup(object):
...     implements(IGroupProvider)
...     def __init__(self, user, request):
...         self.user = user
...         self.request = request
...     def __call__(self):
...         if not self.user.getId().startswith('user'):
...             return []
...         number = self.user.getId()[-1]
...         return ['group' + number]
>>> provideAdapter(
...     ProvideCorrespondentGroup,
...     adapts=(IBasicUser, IHTTPRequest),
...     name=ProvideCorrespondentGroup.__name__
... )

现在让我们检查组是否正确分配给每个用户

>>> sorted(g.getId() for g in api.group.get_groups(username='user1'))
['AuthenticatedUsers', 'group1']

>>> sorted(g.getId() for g in api.group.get_groups(username='user2'))
['AuthenticatedUsers', 'group1', 'group2']

>>> sorted(g.getId() for g in api.group.get_groups(username='user3'))
['AuthenticatedUsers', 'group1', 'group3']

测试清理

>>> from zope.component import getGlobalSiteManager
>>> sm = getGlobalSiteManager()
>>> for a in (ProvideGroup1ToAll, ProvideCorrespondentGroup):
...     removed = sm.unregisterAdapter(
...         provided=IGroupProvider,
...         required=(IBasicUser, IHTTPRequest),
...         name=a.__name__
...     )
>>> list(sm.registeredAdapters())
[]

变更日志

1.0.0 (2015-03-20)

  • Plone 4.3 兼容性。

  • 增加了说明,指出成员资格也可以由组提供者提供到常规(非虚拟)组。

0.3 (2012-01-11)

  • 修复了MANIFEST.in。

0.2 (2012-01-11)

  • 添加了MANIFEST.in,以确保sdist不会损坏。

0.1 (2012-01-11)

  • 第一个版本。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分发

由...