[Zope-dev] LoginManager.

Phillip J. Eby pje@telecommunity.com
Sat, 26 Aug 2000 16:54:55 -0500


At 11:53 PM 8/20/00 +0200, Terje Malmedal wrote:
>
>I've written this, but it just does not work, all that happens is that
>it writes opened to /tmp/source.log
>
>class USER:
>    "Just a little test"
>    name    = None
>    roles   = [ 'Anonymous' , 'member' ]
>    domains = []
>
>    def __init__(self, name):
>        self.name = name

The above will not work, because UserSources *must* provide a user object
which subclasses from LoginUser.


>class SolidUserSource(BasicUserSource):
>
>    """ Solid User Source """
>
>    __plugin_kind__ = "User Source"
>    meta_type       = "Solid User Source"
>    f = open("/tmp/source.log",'a',0)
>    f.write("opened\n")
>    
>    #def __init__(id,title):
>    #    self.f.write("init %s %s\n" % (id,title))
>    #    self.id = id
>    #    self.title = title
>        
>    def existsUser(self, name):
>        self.f.write('Users exists %s\n' % name)
>        return 1
>
>    def retreiveItem(self, name):
>
>        self.f.write('Creating object for %s\n' % name)
>        return USER(name)

Your retrieveItem isn't checking to see if the user exists.  Also, you
spelled it "retreive" when the correct spelling is "retrieve".


>    def rolesForUser(self, user):
>        self.f.write('Returning roles for %s\n' % user.name)
>        return user.roles
>
>    def domainsForUser(self, user):
>        self.f.write('Returning domains for %s\n' % user.name)
>        return user.domains
>
>    def authenticateUser(self, user, password, request):
>        self.f.write('Authenticates user %s\n' % user.name)
>        if user.name == 'aaa' and password == 'aaa':
>            return 1 == 1
>        return 1 == 0

These methods never get called because the code that calls them is in the
LoginUser class, which you have not subclassed your user from.

You may want to consider simply configuring a GenericUserSource; you can
always use ExternalMethods to do so.  It is not so much that making a
custom user source is hard, as that it effectively requires an
understanding of how to subclass the ZPatterns "Rack" concept, and you may
not wish to expend that much effort simply to create a custom user source.
Once you've created a GUS that works as you wish, you can always subclass
GUS and hardwire your working methods into it, if your needs call for a
pure-python, quickly installable solution.