在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)
第一个版本。
项目详情
关闭
collective.anotherdynamicgroupsplugin-1.0.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c76ad10322ff3be099df0f052b4cbb453920b637990ae37d10b18990aaba49f7 |
|
MD5 | cbb6628c476c9095d8968e948614476b |
|
BLAKE2b-256 | 5892bc8ca14c282b98292fdcaa5374dd9be560099003ea4ed6d099699027c3a9 |