Heim  >  Artikel  >  Backend-Entwicklung  >  Golang lernt Webserver-Authentifizierung und -Autorisierung

Golang lernt Webserver-Authentifizierung und -Autorisierung

PHPz
PHPzOriginal
2023-06-24 09:04:051156Durchsuche

Golang ist eine aufstrebende Sprache, die sich besonders für die Implementierung von Webdiensten eignet. Bei Webdiensten sind Authentifizierung und Autorisierung sehr wichtige Sicherheitsmechanismen. In diesem Artikel wird erläutert, wie Sie die Webserverauthentifizierung und -autorisierung in Golang implementieren.

Authentifizierung (Authentifizierung) bezieht sich auf die Überprüfung der Identität des Benutzers und die Feststellung, ob er das Recht hat, auf Ressourcen zuzugreifen. Zu den gängigen Authentifizierungsmethoden gehören Benutzername und Passwort, Token usw. Unter Autorisierung versteht man die Feststellung, ob ein Benutzer die Berechtigung hat, auf eine Ressource zuzugreifen. Umfasst normalerweise rollenbasierte Zugriffskontroll- und ressourcenbasierte Zugriffskontroll-Autorisierungsmethoden.

In Golang können verschiedene Frameworks und Bibliotheken verwendet werden, um die Authentifizierung und Autorisierung von Webdiensten zu implementieren. In diesem Artikel wird am Beispiel des Gin-Frameworks erläutert, wie tokenbasierte Authentifizierung und rollenbasierte Autorisierung implementiert werden.

1. Tokenbasierte Authentifizierung

Im Gin-Framework kann JWT (Json Web Token) zur Implementierung der tokenbasierten Authentifizierung verwendet werden. JWT ist ein offener Standard, der eine präzise, ​​eigenständige Möglichkeit zur sicheren Übertragung von Informationen über das Web definiert. JWT besteht aus drei Teilen: Header, Payload und Signatur.

Der Header wird verwendet, um den Typ des Tokens und den Signaturalgorithmus zu beschreiben, zum Beispiel:

{"alg": "HS256", "typ": "JWT"}

Die Nutzlast wird verwendet, um die Informationen zu speichern, die B. Benutzername, Rollen usw., zum Beispiel:

{"sub": "123456789", "name": "John Doe", "iat": 1516239022}

Signatur wird verwendet Verhindern Sie, dass Informationen manipuliert werden, und zum Signieren ist ein privater Schlüssel erforderlich. Zum Beispiel:

HMACSHA256(
base64UrlEncode(header) + „.“ +
base64UrlEncode(payload),
Secret)

In Golang können Sie verwenden Verwenden Sie die Bibliothek github.com/dgrijalva/jwt-go, um die JWT-Generierung und -Überprüfung zu erreichen. Zum Beispiel:

// Erstellen Sie ein neues Token-Objekt und geben Sie die Signaturmethode und die Ansprüche an, die es enthalten soll.
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{

"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,

})

/ / Signieren Sie das vollständig codierte Token und erhalten Sie es als Zeichenfolge mithilfe des Secrets
tokenString, err := token.SignedString([]byte("secret"))

// Analysieren Sie das Token, um seine Gültigkeit zu überprüfen und extrahieren Sie das Claims
token , err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {

return []byte("secret"), nil

})

Im Gin-Framework können Sie die gin-jwt-Bibliothek verwenden um schnell einen Authentifizierungsmechanismus basierend auf JWT zu erstellen. Zum Beispiel:

// Erstellen Sie eine neue JWT-Middleware mit dem angegebenen Signaturschlüssel
middleware := jwtmiddleware.New(jwtmiddleware.Options{

SigningMethod:   jwt.SigningMethodHS256,
Claims:          &CustomClaims{},
KeyFunc: func(token *jwt.Token) (interface{}, error) {
    // Check the signing method and return the key for verifying the signature
    if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
        return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
    }
    return []byte("secret"), nil
},

})

// Verwenden Sie die Middleware in einer Gin-Route, um die Ressource zu schützen
router .GET("/protected", middleware.MiddlewareFunc(), func(c *gin.Context) {

claims := jwtmiddleware.ExtractClaims(c)
user := claims["user"].(string)
c.JSON(200, gin.H{
    "user": user,
    "message": "Hello, World!",
})

})

2. Rollenbasierte Autorisierung

Im Gin-Framework können Sie rollenbasierte verwenden Berechtigung, den Benutzerzugriff auf Ressourcen einzuschränken. Beispielsweise werden in einer Blog-Anwendung Rollen verwendet, um normale Benutzer und Administratoren zu unterscheiden. Administratoren können auf alle Blog-Ressourcen zugreifen, während normale Benutzer nur auf von ihnen selbst veröffentlichte Blog-Ressourcen zugreifen können.

Sie können die gin-authz-Bibliothek verwenden, um eine rollenbasierte Autorisierung zu implementieren. Zum Beispiel:

// Definieren Sie die Autorisierungs-Middleware, um den rollenbasierten Zugriff zu erzwingen
authMiddleware := authz.NewAuthorizer(authz.BuiltinRolebased())

// Definieren Sie eine rollenbasierte Richtlinie, um der Rolle „Administrator“ Zugriff zu gewähren an alle Ressourcen
adminRole := authz.NewRole("admin", []string{"*"})
policy := authz.NewPolicy()
policy.AddRole(adminRole)

// Verwenden Sie die Richtlinien-Middleware in einem Gin-Route zur Durchsetzung der rollenbasierten Zugriffskontrolle
router.GET("/blogs", authMiddleware.CheckPermission(policy, "admin"), func(c *gin.Context) {

// Return the list of all blogs

})

router.GET ( "/blog/:id", authMiddleware.CheckPermission(policy, "read"), func(c *gin.Context) {

// Return the specified blog

})

router.POST("/blog", authMiddleware.CheckPermission(policy , „write“), func(c *gin.Context) {

// Create a new blog

})

Im obigen Code ist eine Rolle namens „admin“ definiert, die Zugriff auf alle Ressourcen („*“) hat. Überprüfen Sie dann in jeder Route, ob die Rolle des Benutzers Zugriff auf die Ressource hat, indem Sie die Funktion authMiddleware.CheckPermission verwenden.

Zusammenfassung

In diesem Artikel wird erläutert, wie Sie die Webserverauthentifizierung und -autorisierung in Golang implementieren. Durch die Verwendung des Gin-Frameworks und zugehöriger Bibliotheken können wir schnell sichere und zuverlässige Webdienste erstellen.

Das obige ist der detaillierte Inhalt vonGolang lernt Webserver-Authentifizierung und -Autorisierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn