[Grok-dev] Authentication and IAuthenticatorPlugin problem

Lumir Jasiok lumir.jasiok at vsb.cz
Fri Nov 5 05:39:18 EDT 2010


Hi,

I am learning Grog using Grok 1.0 Web Development (GWD) and writing 
small application. Now I reached to the point when I need authenticate 
users. Bud when I follow code from GWD I have problem with getting 
IAuthenticatorPlugin - I guess. In app.py I have:

from zope.app.authentication.authentication import PluggableAuthentication
from zope.app.security.interfaces import IAuthentication
from zope.app.authentication.interfaces import IAuthenticatorPlugin
from auth import setup_authentication
from auth import UserAuthenticatorPlugin

class SpamView(grok.Application, grok.Container):
     grok.local_utility(
         PluggableAuthentication, provides=IAuthentication,
         setup=setup_authentication,
     )
     grok.local_utility(
         UserAuthenticatorPlugin, provides=IAuthenticatorPlugin,
         name='users',
     )
     ...

In auth.py I have:

import grok

from zope.app.authentication.session import SessionCredentialsPlugin
from zope.app.authentication.interfaces import ICredentialsPlugin
from zope.app.authentication.interfaces import IAuthenticatorPlugin
from zope.app.authentication.interfaces import IPrincipalInfo
from zope.app.authentication.interfaces import IPasswordManager
from zope.app.security.interfaces import IAuthentication, 
IUnauthenticatedPrincipal, ILogout
from zope.securitypolicy.interfaces import IPrincipalPermissionManager
from zope.securitypolicy.interfaces import IPrincipalRoleManager
from zope.app.authentication.principalfolder import InternalPrincipal
from zope.interface import Interface
from zope import schema
from zope import component

def setup_authentication(pau):
     pau.credentialsPlugins = ['credentials']
     pau.authenticatorPlugins = ['users']

class MySessionCredentialsPlugin(grok.GlobalUtility, 
SessionCredentialsPlugin):
     grok.provides(ICredentialsPlugin)
     grok.name('credentials')

     loginpagename = 'login'
     loginfield = 'login'
     passwordfield = 'password'


class ILoginForm(Interface):
     login = schema.BytesLine(title=u'Username', required=True)
     camefrom = schema.BytesLine(title=u'', required=False)
     password = schema.Password(title=u'Password', required=True)


class Login(grok.Form):
     grok.context(Interface)
     grok.require('zope.Public')
     label = "Login"
     prefix = ''
     form_fields = grok.Fields(ILoginForm)

     def setUpWidgets(self, ignore_request=False):
         super(Login,self).setUpWidgets(ignore_request)
         self.widgets['camefrom'].type = 'hidden'

     @grok.action('login')
     def handle_login(self, **data):
         print data
         self.redirect(self.request.form.get('camefrom', 
self.url(grok.getSite())))

class Logout(grok.View):
     grok.context(Interface)
     grok.require('zope.Public')

     def update(self):
         if not 
IUnauthenticatedPrincipal.providedBy(self.request.principal):
             auth = component.getUtility(IAuthentication)
             ILogout(auth).logout(self.request)

class UserAuthenticatorPlugin(grok.LocalUtility):
     grok.implements(IAuthenticatorPlugin)
     grok.name('users')

     def __init__(self):
         print "UAP"
         self.user_folder = UserFolder()

     def authenticateCredentials(self, credentials):
         print credentials
         if not isinstance(credentials, dict):
             return None
         if not ('login' in credentials and 'password' in credentials):
             return None
         account = self.getAccount(credentials['login'])
         print "Account " + str(account)

         if account is None:
             print "No account that name"
             return None
         if not account.checkPassword(credentials['password']):
             return None
         return PrincipalInfo(id=account.name,
                              title=account.real_name,
                              description=account.real_name)

     def principalInfo(self, id):
         account = self.getAccount(id)
         if account is None:
             return None
         return PrincipalInfo(id=account.name,
                              title=account.real_name,
                              description=account.real_name)

     def getAccount(self, login):
         return login in self.user_folder and self.user_folder[login] or 
None

     def addUser(self, username, password, real_name, role):
         if username not in self.user_folder:
             user = Account(username, password, real_name, role)
             self.user_folder[username] = user
             role_manager = IPrincipalRoleManager(grok.getSite())
             if role==u'Project Manager':
                 
role_manager.assignRoleToPrincipal('spam.ProjectManager',username)
             else:
                 
role_manager.assignRoleToPrincipal('spam.ProjectMember',username)

     def listUsers(self):
         return self.user_folder.values()

class Account(grok.Model):
     def __init__(self, name, password, real_name, role):
         self.name = name
         self.real_name = real_name
         self.role = role
         self.setPassword(password)

     def setPassword(self, password):
         passwordmanager = component.getUtility(IPasswordManager, 'SHA1')
         self.password = passwordmanager.encodePassword(password)

     def checkPassword(self, password):
         passwordmanager = component.getUtility(IPasswordManager, 'SHA1')
         return passwordmanager.checkPassword(self.password, password)

class IAddUserForm(Interface):
     login = schema.BytesLine(title=u'Username', required=True)
     password = schema.Password(title=u'Password', required=True)
     confirm_password = schema.Password(title=u'Confirm password', 
required=True)
     real_name = schema.BytesLine(title=u'Real name', required=True)
     role = schema.Choice(title=u'User role',
                          values=[u'Project Member', u'Project Manager'],
                          required=True)

class AddUser(grok.Form):
     grok.context(Interface)
     grok.require('zope.ManageApplication')
     label = "Add user"

     form_fields = grok.Fields(IAddUserForm)

     @grok.action('add')
     def handle_add(self, **data):

         print data
         users = component.getUtility(IAuthenticatorPlugin,'users')
         
users.addUser(data['login'],data['password'],data['real_name'],data['role'])
         self.redirect(self.url(grok.getSite(),'userlist'))

class UserFolder(grok.Container):
     pass

class UserList(grok.View):
     grok.context(Interface)
     grok.require('zope.ManageApplication')

     def update(self):
         users = component.getUtility(IAuthenticatorPlugin,'users')
         self.users = users.listUsers()

class ViewSpams(grok.Permission):
     grok.name('spam.view')

class ProjectMemberRole(grok.Role):
     grok.name('spam.ProjectMember')
     grok.permissions('spam.view')

class ProjectManagerRole(grok.Role):
     grok.name('spam.ProjectManager')
     grok.permissions('spam.view')



When I tried as site admin add or list users, I got error message:

Traceback (most recent call last):
   File 
"/home/jas02/test/spam_view/eggs/zope.publisher-3.12.3-py2.6.egg/zope/publisher/publish.py", 
line 134, in publish
     result = publication.callObject(request, obj)
   File 
"/home/jas02/test/spam_view/eggs/grok-1.1.1-py2.6.egg/grok/publication.py", 
line 89, in callObject
     return super(ZopePublicationSansProxy, self).callObject(request, ob)
   File 
"/home/jas02/test/spam_view/eggs/zope.app.publication-3.10.2-py2.6.egg/zope/app/publication/zopepublication.py", 
line 205, in callObject
     return mapply(ob, request.getPositionalArguments(), request)
   File 
"/home/jas02/test/spam_view/eggs/zope.publisher-3.12.3-py2.6.egg/zope/publisher/publish.py", 
line 109, in mapply
     return debug_call(obj, args)
   File 
"/home/jas02/test/spam_view/eggs/zope.publisher-3.12.3-py2.6.egg/zope/publisher/publish.py", 
line 115, in debug_call
     return obj(*args)
   File 
"/home/jas02/test/spam_view/eggs/grokcore.view-1.13.2-py2.6.egg/grokcore/view/components.py", 
line 92, in __call__
     mapply(self.update, (), self.request)
   File 
"/home/jas02/test/spam_view/eggs/zope.publisher-3.12.3-py2.6.egg/zope/publisher/publish.py", 
line 109, in mapply
     return debug_call(obj, args)
   File 
"/home/jas02/test/spam_view/eggs/zope.publisher-3.12.3-py2.6.egg/zope/publisher/publish.py", 
line 115, in debug_call
     return obj(*args)
   File "/home/jas02/test/spam_view/src/spam_view/auth.py", line 162, in 
update
     users = component.getUtility(IAuthenticatorPlugin,'users')
   File 
"/home/jas02/test/spam_view/eggs/zope.component-3.9.1-py2.6.egg/zope/component/_api.py", 
line 171, in getUtility
     raise ComponentLookupError(interface, name)
ComponentLookupError: (<InterfaceClass 
zope.pluggableauth.interfaces.IAuthenticatorPlugin>, 'users')

  I don't now what is problem. It seems that I can't get utility 
IAuthenticatorPlugin. What did I do wrong?

Thanks for any help.

Lumir

-- 
  Lumír Jasiok
  VSB-TU Ostrava - Computer centre
  Tel: +420 59 732 3189
  E-mail: lumir.jasiok at vsb.cz
  http://www.vsb.cz



More information about the Grok-dev mailing list