ProcessWire - passwortgeschützter Bereich

Aus Wikizone
Wechseln zu: Navigation, Suche
https://processwire.com/talk/topic/107-custom-login/

Es gibt Module dafür, aber man kann auch mit Bordmitteln gut arbeiten und ist evtl. flexibler.

Je nachdem was man möchte sind unterschiedliche Ansätze sinnvoll.

  • Seiten schützen
  • Teile von Seiten schützen
  • Was soll passieren wenn man eine geschützte Seite ohne Anmeldung aufruft (Login Form, Redirect...)
  • Login im Seitentemplate oder als Inhaltselement
  • ...

Strategie[Bearbeiten]

User: Um eine Seite zu schützen kann man die Anmeldung eines Users abfragen. Im einfachsten Fall kann man einen User mit der Gruppe "guest" anlegen und den Link Teilen.

Login: Ein Frontendformular ist hier schicker als das BE Formular. Zusätzlich oder auch alleine kann man z.b. das PageProtector Modul nehmen.

Seite nur angemeldeten Usern zeigen: Dazu kann man in der Templateausgabe einfach abfragen ob ein User angemeldet ist und ansonsten nichts ausgeben.

Dateien: Zu überlegen ist ob man den direkten Download noch unterbinden möchte. Stichwort Protected Files. Das ist in ProcessWire von Haus aus möglich.

Beispiel[Bearbeiten]

Beispiel Login / Logoutformular als Layout Block mit Redirect

<?php namespace ProcessWire;
/**
 * fe-login.php provides a login form 
 */

$sectionClasses = 'uk-section fe-login';
$forPage = getForPage($page); // parent page of the repeater matrix
$loginForm = '
<form action="./" method="post">
<div class="login uk-grid uk-child-width-1-3@s" uk-grid>
  <p><input class="uk-input" type="text" id="user" name="user" placeholder="Benutzername"/></p>
  <p><input class="uk-input" type="password" id="pass" name="pass" placeholder="Passwort" /></p>
  <p><input class="uk-input uk-button uk-button-primary" type="submit" name="submit" value="Login" /></p>
</div>
</form>
';
$logoutForm = '
<div class="login logout">
<p>Angemeldet als '.$user->name.'</p>
<p><a class="uk-button uk-button-primary" href="?logout=1">Abmelden</a></p>
</div>
';
$out = '';
if($page->link){
  // Redirect available
  try {
    $linkPage = $pages->get($page->link);
  } catch (\Throwable $th) {
    //throw $th;
    $linkPage = $forPage->path;
  }
}else{
  $linkPage = $forPage->path;
}

// JUST CLICKED LOGGED OUT > LOGOUT & RELOAD PAGE
if($input->get->logout == 1) {
  $session->logout();
  $session->redirect($forPage->path);
}
  
// NOT LOGGED IN 
if(!$user->isLoggedin()){
  
  // FRESH LOGIN > check credentials
  if($input->post->user && $input->post->pass) {
    $user = $sanitizer->username($input->post->user);
    $pass = $input->post->pass;
    if($session->login($user, $pass)) {
      // LOGIN SUCCESS
      $session->redirect($linkPage->path);
    } else {
      // LOGIN FAILED
      $out .= '<p class="uk-alert">Anmeldung ungültig.</p>';
    }
  } else {
  // PRESENT LOGIN FORM
    $out .= $loginForm;
  }
} else {
  // LOGGED IN > SHOW LOGOUT FORM
  $out .= $logoutForm;
}

$sectionClasses = 'fe-login';
$out = '<div class="uk-container">'.$out.'</div>';

//bd($forPage->loginForm,'forPage loginform');
$out = renderSection($page,$out,$sectionClasses);
return $out;