ProcessWire - passwortgeschützter Bereich: Unterschied zwischen den Versionen
(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;