[mod_python] PythonAuthenHandler issues

Graham Dumpleton graham.dumpleton at gmail.com
Sun Jul 22 22:37:18 EDT 2007

On 23/07/07, Brad Anderson <brad at sankatygroup.com> wrote:
> Graham Dumpleton wrote:
> > The reason it doesn't work is technically because the
> > authentication/authorisation phases have been pushed into a single
> > authentication handler when it should be split between a separate
> > authentication and authorisation handlers.
> Okay... and that's the way I had it before reading somewhere (maybe that
> April '06 thread) to stay away from PythonAuthzHandler or a separate
> authzhandler.
> In any case, going back to separate handlers with PythonHandlerModule is
> now working :-D
> >
> > To be more specific, the authentication handler should only do
> > something if req.auth_type() returns the type of authentication type
> > it is meant to handle, it should then only be checking that the
> > login/password is correct and if it is setting req.user to be the
> > username and setting req.ap_auth_type to the authentication type
> > scheme. The latter can usually just be set to the value returned from
> > calling req.auth_type(). Setting req.user and req.ap_auth_type is
> > technically required to indicate to latter phases that authentication
> > was successful.
> I didn't (re)set either of these, but things seem to be working fine.

Checking req.auth_type() result and setting req.ap_auth_type()
technically only really matter when using authenhandler as intended
for Apache modules, although no one ever does it properly with
mod_python. :-)

All it means is that at the start of the handler you have:

  if req.auth_type() != 'Session':
    return apache.DECLINED

This would be the case for an authentication handler which processes
an AuthType of "Session". It simply means that one could register a
whole bunch of different authentication handlers with all being called
and those which didn't apply for the configured AuthType declining to
do anything.

Technically you shouldn't really be using AuthType of 'Basic' as it
conflicts with builting authentication handler, but perhaps instead
use something like:

  AuthType Django::Basic

and then using:

  if req.auth_type() != 'Django::Basic':
    return apache.DECLINED

Finally, if the authentication handler is returning apache.OK to allow
the user through, it would set:

  req.ap_auth_type = 'Django::Basic'

This is just so that a content handler could make some judgment later
based on the authentication mechanism used. Ie., more for completeness
than anything else.

Doing it like this probably has less value in Apache 2.0 than in
Apache 2.2 where the authentication handlers have been improved with
ability to disable authoritativeness for each handler type

Actually interesting that someone started to add concept of
authoritativeness to mod_python at one point and never finished it.
But then, mod_python possibly incorrectly calls
ap_note_basic_auth_failure(req) in the C code when this should be
accessible from Python and only appropriate authentication handlers
call it. So, a but broken in some ways.

For more stuff on doing things the Apache way see:


> > A separate authorisation handler should then process req.requires()
> > but if it doesn't find any requires values pertinent to it, it should
> > return apache.DECLINED. By returning apache.DECLINED it allows the
> > builting authorisation handler to still run and honour vaue such as
> > 'valid-user'.
> This does *not* work.  I found the 'configuration error:  couldn't check
> access.  No groups file?' came back using DECLINED, so I went back to

You should only be returning HTTP_UNAUTHORIZED when you find your
specific Requires token but it fails the test. Other times you should
return DECLINED By always returning HTTP_UNAUTHORIZED it goes against
the Apache way of registering multiple handlers and it only rejecting
things if the appropriate configuration was there to activate it.
Again, in mod_python users tend not to do things the Apache way. :-)

Anyway, by always returning HTTP_UNAUTHORIZED, can't now say:

  Require valid-user

and have it work. For this to work, would need to actually stop your
authorisation handler running altogether.


More information about the Mod_python mailing list