Implement basic authentication logic.

agranig/1_0_subfix
Andreas Granig 12 years ago
parent 5e9ccf605f
commit 11fecbd7ae

@ -20,6 +20,10 @@ use Catalyst qw/
-Debug
ConfigLoader
Static::Simple
Authentication
Session
Session::Store::FastMmap
Session::State::Cookie
/;
extends 'Catalyst';
@ -57,12 +61,83 @@ __PACKAGE__->config(
woff => 'application/x-font-woff',
},
},
session => {
flash_to_stash => 1,
expires => 3600,
},
'Plugin::Authentication' => {
default => {
credential => {
class => 'Password',
password_field => 'password',
password_type => 'clear'
},
store => {
class => 'Minimal',
users => {
}
}
},
subscriber => {
credential => {
class => 'Password',
password_field => 'password',
password_type => 'clear'
},
store => {
class => 'Minimal',
users => {
subscriberadmin => {
password => 'subscriberadmin',
roles => [qw/subscriberadmin subscriber/],
},
subscriber => {
password => 'subscriber',
roles => [qw/subscriber/],
},
}
}
},
reseller => {
credential => {
class => 'Password',
password_field => 'password',
password_type => 'clear'
},
store => {
class => 'Minimal',
users => {
reseller => {
password => 'reseller',
roles => [qw/reseller/],
}
}
}
},
admin => {
credential => {
class => 'Password',
password_field => 'password',
password_type => 'clear'
},
store => {
class => 'Minimal',
users => {
administrator => {
password => 'administrator',
roles => [qw/administrator/],
},
}
}
}
}
);
# Start the application
__PACKAGE__->setup();
=head1 NAME
NGCP::Panel - Catalyst based application

@ -0,0 +1,69 @@
package NGCP::Panel::Controller::Login;
use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; }
=head1 NAME
NGCP::Panel::Controller::Login - Catalyst Controller
=head1 DESCRIPTION
Catalyst Controller.
=head1 METHODS
=cut
=head2 index
=cut
sub index :Path {
my ( $self, $c, $realm ) = @_;
$c->log->debug("*** Login::index");
my $user = $c->req->params->{username};
my $pass = $c->req->params->{password};
$realm = 'subscriber'
unless($realm and ($realm eq 'admin' or $realm eq 'reseller'));
if($user and $pass) {
$c->log->debug("*** Login::index user=$user, pass=$pass, realm=$realm");
if($c->authenticate({ username => $user, password => $pass }, $realm)) {
# auth ok
my $target = $c->session->{'target'} || '/';
delete $c->session->{target};
$c->log->debug("*** Login::index auth ok, redirecting to $target");
$c->response->redirect($target);
} else {
$c->log->debug("*** Login::index auth failed");
}
} else {
$c->log->debug("*** Login::index incomplete creds");
}
$c->stash(realm => $realm);
$c->stash(template => 'login.tt');
}
=head1 AUTHOR
Andreas Granig,,,
=head1 LICENSE
This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
__PACKAGE__->meta->make_immutable;
1;
# vim: set tabstop=4 expandtab:

@ -0,0 +1,46 @@
package NGCP::Panel::Controller::Logout;
use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; }
=head1 NAME
NGCP::Panel::Controller::Logout - Catalyst Controller
=head1 DESCRIPTION
Catalyst Controller.
=head1 METHODS
=cut
=head2 index
=cut
sub index :Path {
my ( $self, $c, $realm ) = @_;
$c->logout;
$c->response->redirect($c->uri_for('/login'));
}
=head1 AUTHOR
Andreas Granig,,,
=head1 LICENSE
This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
__PACKAGE__->meta->make_immutable;
1;
# vim: set tabstop=4 expandtab:

@ -20,6 +20,45 @@ NGCP::Panel::Controller::Root - Root Controller for NGCP::Panel
=head1 METHODS
=head2 auto
Verify user is logged in.
=cut
sub auto :Private {
my($self, $c) = @_;
$c->log->debug("*** Root::auto called");
if($c->controller =~ /::Root\b/
or $c->controller =~ /::Login\b/) {
$c->log->debug("*** Root::auto grant access to root and login controller");
return 1;
}
unless($c->user_exists) {
$c->log->debug("*** Root::auto user not authenticated");
# store uri for redirect after login
my $target = undef;
if($c->request->method eq 'GET') {
if($c->request->uri !~ /\/logout$/) {
$target = $c->request->uri;
}
} else {
$target = $c->request->headers->referer;
}
$c->log->debug("*** Root::auto do login, target='$target'");
$c->session(target => $target);
$c->response->redirect($c->uri_for('/login'));
return;
}
$c->log->debug("*** Root::auto grant access for authenticated user");
return 1;
}
=head2 index
The root page (/)

@ -1,3 +1,4 @@
<body>
<div id="wrapper">
<div id="topbar">
<div class="container">
@ -27,9 +28,8 @@
</ul>
</li>
</ul>
<ul class="pull-right">
<li><a href="javascript:;"><i class="icon-user"></i> Logged in as John Doe</a></li>
<li><a href="javascript:;"><i class="icon-user"></i> Logged in as [% c.user.id %]</a></li>
<li><a href="javascript:;"><span class="badge badge-primary">1</span> New Message</a></li>
<li class="dropdown">
<a href="./pages/settings.html" class="dropdown-toggle" data-toggle="dropdown">
@ -49,7 +49,7 @@
</li>
</ul>
</li>
<li><a href="sipwise_login.html">Logout</a></li>
<li><a href="[% c.uri_for('/logout') %]">Logout</a></li>
</ul>
</div> <!-- /#top-nav -->
</div> <!-- /.container -->
@ -151,13 +151,13 @@
</div>
</div>
<script src="js/libs/jquery-1.7.2.min.js"></script>
<script src="js/libs/jquery-ui-1.8.21.custom.min.js"></script>
<script src="js/libs/jquery.ui.touch-punch.min.js"></script>
<script src="js/libs/bootstrap/bootstrap.min.js"></script>
<script src="js/Theme.js"></script>
<script src="js/plugins/validate/jquery.validate.js"></script>
<script src="js/demos/demo.validation.js"></script>
<script src="/js/libs/jquery-1.7.2.min.js"></script>
<script src="/js/libs/jquery-ui-1.8.21.custom.min.js"></script>
<script src="/js/libs/jquery.ui.touch-punch.min.js"></script>
<script src="/js/libs/bootstrap/bootstrap.min.js"></script>
<script src="/js/Theme.js"></script>
<script src="/js/plugins/validate/jquery.validate.js"></script>
<script src="/js/demos/demo.validation.js"></script>
<script>
$(function () {
@ -191,4 +191,5 @@ $(function () {
});
});
</script>
</body>
[% # vim: set tabstop=4 syntax=html expandtab: -%]

@ -26,8 +26,6 @@
<script src="/js/libs/modernizr-2.5.3.min.js"></script>
</head>
<body>
[% content %]
</body>
[% content %]
</html>
[% # vim: set tabstop=4 syntax=html expandtab: -%]

@ -1,6 +1,8 @@
[%
IF template.name.match('(\.html$|\.css$|\.js$|\.txt$)');
content;
ELSIF template.name.match('^login\.tt$');
content WRAPPER html.tt;
ELSE;
content WRAPPER html.tt + body.tt;
END;

@ -9,7 +9,9 @@ $(function () {
validateCheckbox: { required: true, minlength: 2},
validateRadio: { required: true },
bilprof_select: { required: true }
bilprof_select: { required: true },
username: { minlength: 4, required: true },
password: { minlength: 4, required: true },
}
};
var validationObj = $.extend (rules, Theme.validationRules);

@ -0,0 +1,56 @@
<body class="login">
<div class="account-container login stacked">
<div class="content clearfix">
<form method="post" action="[% c.uri_for("/login/$realm") %]" novalidate="novalidate">
<h1>Sign In</h1>
<div class="login-fields">
<p>Sign in with your [% realm %] credentials:</p>
<div class="field">
<label for="username">Username:</label>
<input type="text" id="username" name="username" value="" placeholder="Username" class="login username-field" />
</div>
<div class="field">
<label for="password">Password:</label>
<input type="password" id="password" name="password" value="" placeholder="Password" class="login password-field"/>
</div>
</div>
<div class="login-actions">
<span class="login-checkbox">
<input id="Field" name="Field" type="checkbox" class="field login-checkbox" value="First Choice" tabindex="4" />
<label class="choice" for="Field">Keep me signed in</label>
</span>
<button class="button btn btn-primary btn-large">Sign In</button>
</div>
</form>
</div>
</div>
[% IF realm == 'subscriber' -%]
<div class="login-extra">
Go to
<a href="[% c.uri_for('/login/admin') %]">Admin</a> or
<a href="[% c.uri_for('/login/reseller') %]">Reseller</a>
login.<br/>
</div>
[% END -%]
[%#
TODO: load this only if a signup plugin is installed
<div class="login-extra">
Don't have an account? <a href="signup.html">Sign Up</a><br/>
</div>
%]
<script src="/js/libs/jquery-1.7.2.min.js"></script>
<script src="/js/libs/jquery-ui-1.8.21.custom.min.js"></script>
<script src="/js/libs/jquery.ui.touch-punch.min.js"></script>
<script src="/js/libs/bootstrap/bootstrap.min.js"></script>
<script src="/js/Theme.js"></script>
<script src="/js/signin.js"></script>
<script>
$(function () {
Theme.init();
});
</script>
</body>
[% # vim: set tabstop=4 syntax=html expandtab: -%]

@ -0,0 +1,10 @@
use strict;
use warnings;
use Test::More;
use Catalyst::Test 'NGCP::Panel';
use NGCP::Panel::Controller::Login;
ok( request('/login')->is_success, 'Request should succeed' );
done_testing();
Loading…
Cancel
Save