Request flow ============ 1. The publisher asks the PluggableAuthService to validate the user's access to a given object:: groups.validate( request, auth, roles ) 2. PluggableAuthService polls its authentication plugins in order, asking each in turn for a user:: for id, plugin in self.listAuthenticationPlugins(): try: user = plugin( request, auth ) except Unauthorized: self.dispatchChallenge( request ) else: user.setAuthenticationSource( id ) break else: user = self.createAnonymousUser() 3. PluggableAuthService allows each of its decorator plugins to annotate the user:: for id, plugin in self.listDecoratorPlugins(): known, schema, data = plugin( user ) if known: sheet = UserPropertySheet( id, schema, **data ) user.addPropertySheet( id, sheet ) 4. PluggableAuthService allows each of its group plugins to assert groups for the user:: for id, plugin in self.listGroupPlugins(): groups = plugin( user ) user.addGroups( groups ) 5. PluggableAuthService returns the annotated / group-ified user to the publisher.