Login-Maske: Zu Menu redirecten falls bereits eingeloggt
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 27 Aug 2012 13:00:48 +0000 (15:00 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 27 Aug 2012 13:00:48 +0000 (15:00 +0200)
Wenn man bereits eingeloggt ist und irgendwo im Programm zu login.pl
redirectet wird (z.B. beim Speichern der Benutzereinstellungen), so
wurde durch die Umstellung des Loginmechanismusses neulich leider die
Loginmaske erneut angezeigt, obwohl eine anständig authentifizierte
Session vorliegt.

SL/Controller/LoginScreen.pm

index f561a39..47dfa90 100644 (file)
@@ -14,6 +14,11 @@ use SL::User;
 sub action_user_login {
   my ($self) = @_;
 
+  # If the user is already logged in then redirect to the proper menu
+  # script.
+  return if $self->_redirect_to_main_script_if_already_logged_in;
+
+  # Otherwise show the login form.
   $self->render('login_screen/user_login');
 }
 
@@ -55,6 +60,27 @@ sub action_login {
   # Everything is fine.
   $::auth->set_cookie_environment_variable();
 
+  $self->_redirect_to_main_script($user);
+}
+
+#
+# settings
+#
+sub get_auth_level {
+  return 'none';
+}
+
+sub keep_auth_vars_in_form {
+  return 1;
+}
+
+#
+# private methods
+#
+
+sub _redirect_to_main_script {
+  my ($self, $user) = @_;
+
   return $self->redirect_to($::form->{callback}) if $::form->{callback};
 
   my %style_to_script_map = (
@@ -68,14 +94,25 @@ sub action_login {
   $self->redirect_to(controller => "menu${menu_script}.pl", action => 'display');
 }
 
-#
-# settings
-#
-sub get_auth_level {
-  return 'none';
-}
+sub _redirect_to_main_script_if_already_logged_in {
+  my ($self) = @_;
+
+  # Get 'login' from valid session.
+  my $login = $::auth->get_session_value('login');
+  return unless $login;
+
+  # See whether or not the user exists in the database.
+  my %user = $::auth->read_user(login => $login);
+  return if ($user{login} || '') ne $login;
+
+  # Check if the session is logged in correctly.
+  return if SL::Auth::OK() != $::auth->authenticate($login, undef);
+
+  $::auth->create_or_refresh_session;
+  $::auth->delete_session_value('FLASH');
+
+  $self->_redirect_to_main_script(\%user);
 
-sub keep_auth_vars_in_form {
   return 1;
 }