[cgiapp] Re: CAP:Authentication with an enum credential
Mark Rajcok
mrajcok at gmail.com
Mon Apr 20 21:13:51 EDT 2009
On Wed, Apr 15, 2009 at 9:15 AM, Mark Stosberg <mark at summersault.com> wrote:
> On Tue, 14 Apr 2009 01:06:38 -0400
> Mark Rajcok <mrajcok at gmail.com> wrote:
>
> > I'm using CAP:Authentication and I have a u_state field in my Users
> table.
> > The u_state field is a MySQL enum, and can be set to created, active,
> > restricted, or disabled.
> >
> > I'm trying to figure out how I can display a "Sorry, your account has
> been
> > disabled" error page if a user with u_state=disabled tries to log in.
> >
> > I looked at (and tried using) custom filters with CAP:Authentication, but
> > something like the following isn't supported syntax-wise:
> > CONSTRAINTS => { 'stateFilter:u_state' =>
> "(created,active,restricted)"
> > }
> >
> > Any suggestions?
>
> I think you are right, Mark. I think you may need to write your own driver
> for
> this.
>
> You can copy the DBI driver and modify it, or write one from scratch, which
> has
> the possibility of being simpler and less abstracted because it is designed
> just for your case.
>
> You could also ask Cees if he's interested in patch for "enum()" support
> in
> CGI::Application::Plugin::Authentication.
>
> Mark
>
Not exactly efficient (because I make another query of the database for
every successful login), but here's what I'm doing for now:
Added a callback to $self->authen->config(
POST_LOGIN_CALLBACK => \&_post_login,
sub _post_login { # we only get here if we authenticated
my $self = shift;
my $sql = 'select count(*) from user where u_username = ? and u_state =
"disabled"';
if($self->dbh->selectrow_arrayref($sql, undef,
$self->authen->username)->[0]) {
$self->authen->logout;
my $page = $self->custom_error(
type=>'forbidden', msg=>'Your account has been disabled.');
print $self->query->header, $page;
exit # prevent any other/normal CAP processing
}
# else the callback returns and the user is logged in
}
custom_error() is essentially and error run mode that I wrote.
In essence, I'm using CAP::Authentication for normal username+password
authentication, then I have this additional method to check the account
state.
More information about the cgiapp
mailing list