From 00b370ed0e82d46cb65fe3f92b2a994cc1770c4f Mon Sep 17 00:00:00 2001 From: "Eric A. Miller" Date: Sun, 26 Jan 2014 16:24:03 -0500 Subject: [PATCH] [#77] Log user access --- Netdisco/Changes | 3 +- Netdisco/lib/App/Netdisco/Web.pm | 51 ++++++++++++++++++++++++++++++++ Netdisco/share/config.yml | 1 + 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Netdisco/Changes b/Netdisco/Changes index 7f107709..3abfb324 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -6,7 +6,8 @@ [ENHANCEMENTS] - * [#69] Add search by layers to device search + * [#69] Add search by layers to device search + * [#77] Log user access 2.022000 - 2014-01-26 diff --git a/Netdisco/lib/App/Netdisco/Web.pm b/Netdisco/lib/App/Netdisco/Web.pm index 548c3c36..e52f7680 100644 --- a/Netdisco/lib/App/Netdisco/Web.pm +++ b/Netdisco/lib/App/Netdisco/Web.pm @@ -94,6 +94,57 @@ get qr{^/(?:login(?:/denied)?)?} => sub { template 'index'; }; +# Override default login_handler so that we can log access in the +# database +post '/login' => sub { + my ($success, $realm) = authenticate_user( + params->{username}, params->{password} + ); + if ($success) { + session logged_in_user => params->{username}; + session logged_in_user_realm => $realm; + + schema('netdisco')->resultset('UserLog')->create({ + username => session('logged_in_user'), + userip => request->remote_address, + event => "Login", + details => params->{return_url}, + }); + + redirect params->{return_url} || uri_for('/'); + } else { + + schema('netdisco')->resultset('UserLog')->create({ + username => params->{username}, + userip => request->remote_address, + event => "Login Failure", + details => params->{return_url}, + }); + + vars->{login_failed}++; + forward uri_for('/login'), { login_failed => 1 }, { method => 'GET' }; + } +}; + +# Since we override the default login_handler, logout has to be handled as +# well +any ['get','post'] => '/logout' => sub { + + schema('netdisco')->resultset('UserLog')->create({ + username => session('logged_in_user'), + userip => request->remote_address, + event => "Logout", + details => '', + }); + + session->destroy; + if (params->{return_url}) { + redirect params->{return_url}; + } else { + return "OK, logged out successfully."; + } +}; + any qr{.*} => sub { var('notfound' => true); status 'not_found'; diff --git a/Netdisco/share/config.yml b/Netdisco/share/config.yml index 877dd1d0..3c7d09b3 100644 --- a/Netdisco/share/config.yml +++ b/Netdisco/share/config.yml @@ -192,6 +192,7 @@ plugins: Auth::Extensible: no_api_change_warning: true no_default_pages: true + no_login_handler: true realms: users: provider: 'App::Netdisco::Web::Auth::Provider::DBIC'