[mod_python] PythonAuthzHandler not working

Graham Dumpleton grahamd at dscpl.com.au
Sat Apr 22 23:44:31 EDT 2006


On 23/04/2006, at 11:43 AM, Graham Dumpleton wrote:

>
> On 23/04/2006, at 8:19 AM, Graham Dumpleton wrote:
>
>>
>> On 23/04/2006, at 5:22 AM, Jim Gallacher wrote:
>>
>>> Graham Dumpleton wrote:
>>>> Add to config:
>>>>   AuthAuthoritative Off
>>>
>>> That doesn't really make sense to me. Nothing like this is  
>>> mentioned for other auth modules like mod_auth_ldap.
>>
>> I couldn't even find it documented. It is mentioned in source code  
>> for 2.0.
>> Turns of inbuilt auth.
>
> BTW, if you are using Apache 2.2, you might actually need both:
>
>   AuthzDefaultAuthoritative Off
>   AuthzUserAuthoritative Off
>
> I didn't check before if it had changed form 2.0 to 2.2.
>
> I'll do some tests and get back to you on what is required for 2.2  
> if that
> is what you are using.

Done testing, and on Apache 2.2, you don't need either of the above.

Here is a summary of what I found. Note that I am using mod_python 3.3
from trunk. First off, am using the handlers:

     from mod_python import apache

     def authenhandler(req):
         apache.log_error("authenhandler")
         req.phases = ["authenhandler"]
         req.user = "grumpy"
         req.ap_auth_type = req.auth_type()
         return apache.OK

     def authzhandler(req):
         apache.log_error("authzhandler")
         req.phases.append("authzhandler")
         return apache.OK

     def handler(req):
         apache.log_error("handler")
         req.phases.append("handler")
         req.content_type = "text/plain"
         req.write(req.ap_auth_type+"\n")
         req.write(req.user+"\n")
         req.write(str(req.phases)+"\n")
         return apache.OK

For Apache 2.0, the configuration that works is:

     SetHandler mod_python

     PythonAuthenHandler authz_1
     PythonAuthzHandler authz_1
     PythonHandler authz_1
     PythonDebug On

     AuthType authztest
     Require group grumpy
     #AuthAuthoritative Off

The result in the browser is:

     authztest
     grumpy
     ['authenhandler', 'authzhandler', 'handler']

Note that I am not using AuthAuthoritative in the end here.

Now, if I instead use either:

     Require user grumpy

or:

     Require valid-user

even if set in conjunction with:

     Require group grumpy

the result is:

     authztest
     grumpy
     ['authenhandler', 'handler']

Thus, no authzhandler run. This is because builtin mod_authz is  
getting run before
my authzhandler and the user condition is being satisfied and so my  
handler never
gets to run.

If you want to have something like 'valid-user' or 'user', you need  
to call it something
else. For example, thus:

     Require authztest::valid-user

If I do that alone though, I get authorization required response and  
error log says:

     [Sun Apr 23 13:21:58 2006] [error] [client ::1] access to / 
testing/authz-1/ failed, reason: unknown require  
directive:"authztest::valid-user"

To get past that, that is where in Apache 2.0 I need to set  
AuthAuthoritative.

     SetHandler mod_python

     PythonAuthenHandler authz_1
     PythonAuthzHandler authz_1
     PythonHandler authz_1
     PythonDebug On

     AuthType authztest
     Require authztest::valid-user
     AuthAuthoritative Off

Thus I again get:

     authztest
     grumpy
     ['authenhandler', 'authzhandler', 'handler']

In Apache 2.2, things are slightly different. Using:

     SetHandler mod_python

     PythonAuthenHandler authz_1
     PythonAuthzHandler authz_1
     PythonHandler authz_1
     PythonDebug On

     AuthType authztest
     Require group grumpy

still works okay. Using:

     Require user grumpy

or:

     Require valid-user

still results in:

     authztest
     grumpy
     ['authenhandler', 'handler']

In Apache 2.2, if I use:

     SetHandler mod_python

     PythonAuthenHandler authz_1
     PythonAuthzHandler authz_1
     PythonHandler authz_1
     PythonDebug On

     AuthType authztest
     Require authztest::valid-user

I get:

     authztest
     grumpy
     ['authenhandler', 'authzhandler', 'handler']

So, no need to have any equivalent to AuthAuthoritative in Apache 2.2.

In summary, situation seems to be that if you want to perform  
authorization based
on group member ship, okay to still use:

     Require group grumpy

But you should not set AuthGroupFile, because if you do then the  
builting authz handler
will try and do the interpretation itself.

If you want equivalents to 'valid-user' or 'user' where your  
authzhandler interprets them,
you need to qualify them to avoid builtin authz module interpreting  
them. Thus use something
like:

     Require authztest::valid-user
     Require authztest::user grumpy

and the check req.requires for pertinent tags and data.

Going back to your original configuration:

     <Directory /srv/projects/aos/html/aos-admin/>
       DirectoryIndex index.py

Take note of DirectoryIndex problems recorded in:

     http://issues.apache.org/jira/browse/MODPYTHON-146

This would be an issue if you are trying to pass data in req through  
from these handlers
to content handler. Plus notes and subprocess_env values can get  
duplicated.

       AllowOverride None
       AddHandler mod_python .py

       AuthType PyCookie
       AuthName "Restricted"
       Require valid-user

If req.user is set, use of 'valid-user' would cause inbuilt authz  
handler to return
OK and so your authzhandler would not run. If though req.user hadn't  
been
set by authenhandler, you probably get an error occur.

       Require admin

The "admin" tag is not one known of by Apache. If you were using  
Apache 2.0
you would most like be getting:

     [Sun Apr 23 13:41:06 2006] [error] [client ::1] access to / 
testing/authz-1/ failed, reason: unknown require directive:"admin"

Thus, in Apache 2.0, you would need to have AuthAuthoritative set. In  
Apache 2.2
you wouldn't need to.

       PythonAccessHandler mprest.authtest
       PythonAuthenHandler mprest.authtest
       PythonAuthzHandler mprest.authtest
       PythonHandler mprest.authtest

     </Directory>

Now, what was the final configuration you were trying to use and what  
version of
Apache were you using?

Graham





More information about the Mod_python mailing list