Gopress, ein Blog in Golang (Teil 8)
Hallo zusammen! Wir setzen unsere Serie fort, wie man einen Blog mit Golang erstellt, der Programmiersprache, die von Google entwickelt wurde und immer beliebter wird. Falls ihr die vorherigen Teile verpasst habt, lade ich euch ein, unsere früheren Artikel zu lesen und euch auf den neuesten Stand zu bringen. Heute, im achten Teil unserer Serie, konzentrieren wir uns auf Authentifizierung und Sicherheit. Lasst uns beginnen!
Checkboxen
Authentifizierung und Sicherheit
Bisher haben wir unseren Blog, Gopress, mit grundlegenden Funktionen erstellt, aber wir haben noch keinen Authentifizierungsmechanismus implementiert. Wir möchten nicht, dass jeder beliebige Inhalte auf unserem Blog veröffentlichen, bearbeiten oder löschen kann. Um das zu verhindern, müssen wir ein Authentifizierungssystem implementieren.
In Golang gibt es mehrere Bibliotheken, die uns bei der Authentifizierung helfen können. Für dieses Tutorial verwenden wir „gorilla/sessions“ zur Verwaltung von Benutzersitzungen und „golang.org/x/crypto/bcrypt“ zum Hashing von Passwörtern.
Implementierung von Sitzungen mit Gorilla/Sessions
Zunächst müssen wir das Paket Gorilla Sessions installieren. Wenn du Go-Module verwendest, kannst du das mit folgendem Befehl tun:
bashCopy codego get github.com/gorilla/sessions
Als Erstes definieren wir eine globale Variable für unseren Sitzungsspeicher:
goCopy codevar (
key = []byte("super-secret-key")
store = sessions.NewCookieStore(key)
)
Danach können wir eine Funktion implementieren, um nach erfolgreichem Login eine Sitzung zu setzen:
goCopy codefunc setSession(userName string, w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "cookie-name")
session.Values["authenticated"] = true
session.Values["username"] = userName
session.Save(r, w)
}
Und eine weitere Funktion, um zu überprüfen, ob ein Benutzer authentifiziert ist:
goCopy codefunc checkSession(r *http.Request) bool {
session, _ := store.Get(r, "cookie-name")
if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
return false
}
return true
}
Passwort-Hashing mit bcrypt
Jetzt kümmern wir uns um die sichere Handhabung von Passwörtern mit bcrypt. Du kannst bcrypt mit folgendem Befehl erhalten:
bashCopy codego get golang.org/x/crypto/bcrypt
Wenn sich ein Benutzer registriert oder sein Passwort ändert, müssen wir sicherstellen, dass wir das Passwort nicht im Klartext speichern. Stattdessen speichern wir einen Hash des Passworts. Hier ist die Funktion zum Erzeugen des Passwort-Hashes:
goCopy codefunc hashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
Und wenn sich ein Benutzer anmeldet, können wir das eingegebene Passwort mit dem gespeicherten Hash überprüfen:
goCopy codefunc checkPasswordHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
Und das war’s für heute! Jetzt hast du die Werkzeuge, um die Authentifizierung in deinem Gopress-Blog zu implementieren. Im nächsten Beitrag konzentrieren wir uns auf die Verwaltung von Rollen und Berechtigungen für Benutzer. Wie immer, wenn du Fragen oder Probleme hast, zögere nicht, uns einen Kommentar zu hinterlassen.
Rollen- und Berechtigungsverwaltung
Jetzt, wo wir die Authentifizierung haben, möchten wir vielleicht Rollen und Berechtigungen implementieren. Zum Beispiel könnten wir eine „Editor“-Rolle haben, die Beiträge überprüfen und freigeben kann, bevor sie veröffentlicht werden, und eine „Autor“-Rolle, die eigene Beiträge schreiben und bearbeiten, aber nicht die von anderen bearbeiten kann.
Um dies zu implementieren, müssen wir zunächst unser Benutzermodell um ein Rollenfeld erweitern:
goCopy codetype User struct {
ID int
Username string
Password string
Role string
}
Dann können wir während der Authentifizierung die Rolle eines Benutzers überprüfen. Hier ist eine Beispielfunktion, die überprüft, ob ein Benutzer ein Editor ist:
goCopy codefunc checkRole(r *http.Request) string {
session, _ := store.Get(r, "cookie-name")
role := session.Values["role"].(string)
return role
}
Wir können diese Funktion in unseren Controllern verwenden, um den Zugriff auf bestimmte Funktionen basierend auf der Benutzerrolle einzuschränken. Zum Beispiel:
goCopy codefunc editPostHandler(w http.ResponseWriter, r *http.Request) {
if !checkSession(r) {
http.Redirect(w, r, "/login", 302)
return
}
if checkRole(r) != "editor" {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
// ... código para editar la publicación ...
}
In diesem Code leiten wir nicht authentifizierte Benutzer zur Anmeldeseite weiter. Wenn der Benutzer authentifiziert ist, aber kein Editor, geben wir einen 403-Verweigert-Fehler zurück. Nur Editoren können auf die Funktion zum Bearbeiten von Beiträgen zugreifen.
Wir hoffen, dieser Artikel war hilfreich, um zu verstehen, wie du Authentifizierung und Rollen in deinem Gopress-Blog implementierst. Im nächsten Beitrag werden wir untersuchen, wie man eine Suchfunktion im Blog implementiert. Bis zum nächsten Mal!
Comentarios