我有一个脚本,它使用manage_setLocalRoles为指定的某些用户分配特定角色。请参阅下面的代码段
context.manage_setLocalRoles(username, (‘Editor’, ‘Reviewer’))
context.reindexObjectSecurity()
运行该脚本后,您可以转到页面的“共享”标签,查看指定了Reviewer
和Editor
的用户。但是,该用户没有任何与这些角色一起使用的权限。
为了测试,我进行了以下检查
context.getMyRolesInContext()
不会返回上面设置的任何角色。context.get_local_roles_for_userid(username)
仅显示上面设置的角色,而不显示任何全局角色集(当作为站点管理器等进行测试时)。context.portal_membership.checkPermission(“Modify portal content”)
返回False
。 Editor
角色我应该获得Modify portal content
权限。我确实在内容类型的工作流程中进行了验证,以确保为每个州的权限正确设置了角色。作为一个仔细检查,我在内容上运行了这个脚本。
username = context.getCurrentUserName()
roles = context.rolesOfPermission('Modify portal content')
member = context.portal_membership.getMemberById(username)
for role in roles:
if role['selected']!='':
print role['name']
print member.has_role(role['name'], context)
return printed
这是我的结果:
Editor
0
Manager
1
Reviewer
0
Site Administrator
0
这些结果来自我的网站管理员角色,但是在我的用户上运行manage_setLocalRoles后添加Editor
和Reviewer
。
关于角色为何无处不在地被认可的任何想法?或者我使用错误的过程来完成我想要完成的任务?
注意 - 我已经查看了this的答案,而且我的代码反映了我已经在做了它的建议。
编辑
每条评论添加版本。我们有很多附加组件,但它们似乎都不相关。主要是jQuery集成,以及PFG,True Gallery,FullCalendar等类型。我们使用自定义主题和所有自定义内容类型和工作流程。排除我当前为此项目创建的内容类型,主题和所有其他内容类型都是在我到达之前创建的。类型是Archetypes扩展。
答案 0 :(得分:0)
问题归结为区分大小写。我们的用户来自Active Directory插件。一些用户名都是大写字母,而其他用户名都是较低的。不知何故,我的set roles命令中使用的用户名始终是小写的。结果,user
获得了角色,而它应该是USER
。
我的解决方案是首先从portal_membership
获取实际成员,然后从成员中获取用户名。
pm = getToolByName(self, 'portal_membership')
user = pm.getMemberById(username)
self.manage_setLocalRoles(member.getUserName(), ('Reviewer', 'Editor'))
self.reindexObjectSecurity()
显然getMemberById()
不区分大小写,并且在正确的情况下返回正确的用户名。所以我只是错过了额外的检查/过滤器。