ProcessWire - passwortgeschützter Bereich: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „ 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 nach…“)
 
 
Zeile 10: Zeile 10:
 
* ...
 
* ...
  
 +
== Strategie ==
 +
'''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 ==
 +
'''Beispiel Login / Logoutformular als Layout Block mit Redirect'''
 
<syntaxhighlight lang="php">
 
<syntaxhighlight lang="php">
 +
<?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;
 +
 
</syntaxhighlight>
 
</syntaxhighlight>

Aktuelle Version vom 30. September 2022, 20:32 Uhr

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;