Hi,

thanks for confirming, that I didn't miss anything. I have – for now – resolved to something similar:

my ($username,$password) = $c->req->headers->authorization_basic;
my ($u,$d) = split(/\@/,$username);
$c->req->headers->authorization_basic($u,$password);
my $res = $c->authenticate({}, $realm);

if($c->user_exists) {
    $c->log->debug("checking '".$c->user->domain->domain."' against '$d'");
    if ($c->user->domain->domain ne $d) {
        $c->user->logout;
$c->log->warn("invalid api http login from '".$c->req->address."'");
        my $r = $c->get_auth_realm($realm);
        $r->credential->authorization_required_response($c, $r);
        return;
    }
    ...
} else {
    $c->log->warn("invalid api http login from '".$c->req->address."'");
    my $r = $c->get_auth_realm($realm);
    $r->credential->authorization_required_response($c, $r);
    return;
}


If I get around to it, I'll consider extending Catalyst::Authentication::Credential::HTTP because this sounds like a useful feature.

-Gerhard



On 2016-05-17 11:45, Dermot wrote:
We had a similar problem at $work. To get what we wanted we had to stop using the HTTP plugin and do something like this (warning: hand-written, un-tested code follows) in the Root controller.

my ( $username, $password ) = $c->request->headers->authorization_basic;
my $logged_in_user;
if ( defined $username && defined $password ) {
some_method_in_users_that_concatenates_and_athenticates($username, $password);
}

if ($logged_in_user) {
   $c->stash(user => $logged_in_user;
   ...
}
else {
  $c->response->header('WWW-Authenticate' => 'Basic realm="MyRealm");
  $c->response->content_type('text/plain');
  $c->response->status(401);
  $c->detach();
}


HTH,
Dermot

On 13 May 2016 at 16:32, Gerhard Jungwirth <[email protected] <mailto:[email protected]>> wrote:

    Hi,

    I am using Catalyst::Authentication::Store::DBIx::Class and
    Catalyst::Authentication::Credential::HTTP with the following
    configuration:

            my_realm => {
                credential => {
                    class => 'HTTP',
                    type => 'basic',
                    username_field => 'username',
                    password_field => 'password',
                    password_type => 'clear',
                },
                store => {
                    class => 'DBIx::Class',
                    user_model => 'DB::my_user_table',
                },
            },

    Which works great. The thing is: I want the user to authenticate
    in the form "username@domain:password" using HTTP Basic
    Authentication, where username and domain are checked against
    separate fields in my DBIx::Class table. (Ideally, domain is
    checked against a related table in my schema)

    Is that supported? If not, can it be added? If not, how do you
    suggest I implement that?

    Thanks and Cheers,
    Gerhard

    _______________________________________________
    List: [email protected] <mailto:[email protected]>
    Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
    Searchable archive:
    http://www.mail-archive.com/[email protected]/
    Dev site: http://dev.catalyst.perl.org/




_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to