[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