Global principal definition =========================== Global principals are defined via ZCML. There are several kinds of principals that can be defined. Authenticated Users ------------------- There are principals that can log in: >>> zcml(""" ... ... ... ... ... ... """) >>> from zope.app.security.principalregistry import principalRegistry >>> [p] = principalRegistry.getPrincipals('') >>> p.id, p.title, p.description, p.getLogin(), p.validate('123') ('zope.manager', u'Manager', u'System Manager', u'admin', True) The unauthenticated principal ----------------------------- There is the unauthenticated principal: >>> zcml(""" ... ... ... ... ... ... """) >>> p = principalRegistry.unauthenticatedPrincipal() >>> p.id, p.title, p.description ('zope.unknown', u'Anonymous user', u"A person we don't know") The unauthenticated principal will also be registered as a utility. This is to provide easy access to the data defined for the principal so that other (more featureful) principal objects can be created for the same principal. >>> from zope import component >>> from zope.app.security import interfaces >>> p = component.getUtility(interfaces.IUnauthenticatedPrincipal) >>> p.id, p.title, p.description ('zope.unknown', u'Anonymous user', u"A person we don't know") The unauthenticated group ------------------------- An unauthenticated group can also be defined in ZCML: >>> zcml(""" ... ... ... ... ... ... """) This directive creates a group and registers it as a utility providing IUnauthenticatedGroup: >>> g = component.getUtility(interfaces.IUnauthenticatedGroup) >>> g.id, g.title, g.description ('zope.unknowngroup', u'Anonymous users', u"People we don't know") The unauthenticatedGroup directive also updates the group of the unauthenticated principal: >>> p = principalRegistry.unauthenticatedPrincipal() >>> g.id in p.groups True >>> p = component.getUtility(interfaces.IUnauthenticatedPrincipal) >>> g.id in p.groups True If the unauthenticated principal is defined after the unauthenticated group, it will likewise have the group added to it: >>> reset() >>> zcml(""" ... ... ... ... ... ... ... """) >>> g = component.getUtility(interfaces.IUnauthenticatedGroup) >>> g.id, g.title, g.description ('zope.unknowngroup2', u'Anonymous users', u"People we don't know") >>> p = principalRegistry.unauthenticatedPrincipal() >>> p.id, g.id in p.groups ('zope.unknown2', True) >>> p = component.getUtility(interfaces.IUnauthenticatedPrincipal) >>> p.id, g.id in p.groups ('zope.unknown2', True) The unauthenticated group shows up as a principal in the principal registry: >>> principalRegistry.getPrincipal(g.id) == g True >>> list(principalRegistry.getPrincipals("Anonymous")) == [g] True The authenticated group ----------------------- There is an authenticated group: >>> reset() >>> zcml(""" ... ... ... ... ... ... ... ... ... """) It defines an IAuthenticatedGroup utility: >>> g = component.getUtility(interfaces.IAuthenticatedGroup) >>> g.id, g.title, g.description ('zope.authenticated', u'Authenticated users', u'People we know') It also adds it self to the groups of any non-group principals already defined, and, when non-group principals are defined, they put themselves in the group if it's defined: >>> principals = list(principalRegistry.getPrincipals('')) >>> principals.sort(lambda p1, p2: cmp(p1.id, p2.id)) >>> for p in principals: ... print p.id, p.groups == [g.id] zope.authenticated False zope.manager2 True zope.manager3 True Excluding unauthenticated principals, of course: >>> p = principalRegistry.unauthenticatedPrincipal() >>> p.id, g.id in p.groups ('zope.unknown3', False) >>> p = component.getUtility(interfaces.IUnauthenticatedPrincipal) >>> p.id, g.id in p.groups ('zope.unknown3', False) The everybody group ------------------- Finally, there is an everybody group: >>> reset() >>> zcml(""" ... ... ... ... ... ... ... ... ... """) The everybodyGroup directive defines an IEveryoneGroup utility: >>> g = component.getUtility(interfaces.IEveryoneGroup) >>> g.id, g.title, g.description ('zope.everybody', u'Everybody', u'All People') It also adds it self to the groups of any non-group principals already defined, and, when non-group principals are defined, they put themselves in the group if it's defined: >>> principals = list(principalRegistry.getPrincipals('')) >>> principals.sort(lambda p1, p2: cmp(p1.id, p2.id)) >>> for p in principals: ... print p.id, p.groups == [g.id] zope.everybody False zope.manager4 True zope.manager5 True Including unauthenticated principals, of course: >>> p = principalRegistry.unauthenticatedPrincipal() >>> p.id, g.id in p.groups ('zope.unknown4', True) >>> p = component.getUtility(interfaces.IUnauthenticatedPrincipal) >>> p.id, g.id in p.groups ('zope.unknown4', True) Note that it is up to IAuthentication implementations to associate these groups with their principals, as appropriate.