You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Dave Greco <da...@gleim.com> on 2001/04/13 00:19:43 UTC

AuthenHandler Problems

I am having some serious problems with a custom AuthenHandler. Basically, 
it looks up users/passwords/groups in a database. The problem is whenever I 
encounter a bad password/username, I want the dialog box to reappear asking 
for them. Instead, the 401 error page is being displayed.  Below is the 
config and most of the code:

<Location /php/show.gleim.com>
     Options Indexes ExecCGI
     PerlAuthenHandler Apache::AuthDir
     AuthType Basic
     AuthName "show.gleim.com"
     require valid-user
</Location>



package Apache::AuthDir;

use Apache::Constants qw(:common);

use DBI;
$dbh = DBI->connect('DBI:mysql:SGC');

sub handler {

     $req = shift;

     return OK unless $req->is_initial_req;

     my( $res, $passwd ) = $req->get_basic_auth_pw();
     return $res if $res != OK;

     my $user = $req->connection->user;
     my $uri = $req->uri;
     my $subr = $req->lookup_uri($uri);
     my $filename = $subr->filename;

     # Matches /php/show.gleim.com/(oranges/)
     $uri =~ /^\/php\/show.gleim.com\/(.*)$/;
     $dir = $1;

     #$req->server->log_error("$dir - $user - $passwd");

     # check user and password
     if ( ! checkPassword($user, $passwd) ) {
         $req->note_basic_auth_failure;
         return AUTH_REQUIRED;
     }

     if (-d $filename) {
         # Remove any trailing /
         $dir =~ s/\/$//;

         # check user and directory
         if (! checkDirectory($user, $dir) ) {
             #$req->server->log_error("$user tried to access $dir but 
couldnt");
             return FORBIDDEN;
         }
     }

     if (-f $filename) {
         if (! checkFile($user, $file) ) {
             #$req->server->log_error("$user tried to access $file but 
couldnt");
             return FORBIDDEN;
         }
     }

     # Else they are OK
     $req->connection->auth_type('Basic');
     $req->connection->user($user);
     return OK;
}

____________________________________
Dave Greco
dave@gleim.com
Network Administrator
Gleim Publications, Inc.
(800) 87-GLEIM x312
http://www.gleim.com
____________________________________


Re: AuthenHandler Problems

Posted by Mike Cameron <mc...@mirusweb.com>.

Dave Greco wrote:

> I am having some serious problems with a custom AuthenHandler. Basically,
> it looks up users/passwords/groups in a database. The problem is whenever I
> encounter a bad password/username, I want the dialog box to reappear asking
> for them. Instead, the 401 error page is being displayed.  Below is the
> config and most of the code:
>
> <Location /php/show.gleim.com>
>      Options Indexes ExecCGI
>      PerlAuthenHandler Apache::AuthDir
>      AuthType Basic
>      AuthName "show.gleim.com"
>      require valid-user
> </Location>
>
> package Apache::AuthDir;
>
> use Apache::Constants qw(:common);
>
> use DBI;
> $dbh = DBI->connect('DBI:mysql:SGC');
>
> sub handler {
>
>      $req = shift;
>

>
>      return OK unless $req->is_initial_req;
>

How about redirecting the error back to the original URI, that may work

    $req->custom_response(AUTH_REQUIRED,"/php/show.gleim.com");

>
>      my( $res, $passwd ) = $req->get_basic_auth_pw();
>      return $res if $res != OK;

>
>      my $user = $req->connection->user;
>      my $uri = $req->uri;
>      my $subr = $req->lookup_uri($uri);
>      my $filename = $subr->filename;
>
>      # Matches /php/show.gleim.com/(oranges/)
>      $uri =~ /^\/php\/show.gleim.com\/(.*)$/;
>      $dir = $1;
>
>      #$req->server->log_error("$dir - $user - $passwd");
>
>      # check user and password
>      if ( ! checkPassword($user, $passwd) ) {
>          $req->note_basic_auth_failure;
>          return AUTH_REQUIRED;
>      }
>
>      if (-d $filename) {
>          # Remove any trailing /
>          $dir =~ s/\/$//;
>
>          # check user and directory
>          if (! checkDirectory($user, $dir) ) {
>              #$req->server->log_error("$user tried to access $dir but
> couldnt");
>              return FORBIDDEN;
>          }
>      }
>
>      if (-f $filename) {
>          if (! checkFile($user, $file) ) {
>              #$req->server->log_error("$user tried to access $file but
> couldnt");
>              return FORBIDDEN;
>          }
>      }
>
>      # Else they are OK
>      $req->connection->auth_type('Basic');
>      $req->connection->user($user);
>      return OK;
> }
>
> ____________________________________
> Dave Greco
> dave@gleim.com
> Network Administrator
> Gleim Publications, Inc.
> (800) 87-GLEIM x312
> http://www.gleim.com
> ____________________________________