Rumah >pembangunan bahagian belakang >Golang >Pengurusan sesi dan aplikasinya dalam rangka kerja Gin

Pengurusan sesi dan aplikasinya dalam rangka kerja Gin

WBOY
WBOYasal
2023-06-22 12:38:391759semak imbas

Rangka kerja Gin ialah rangka kerja web ringan yang dibangunkan menggunakan bahasa Go dan mempunyai kelebihan kecekapan, kemudahan penggunaan, fleksibiliti dan kelebihan lain. Dalam pembangunan aplikasi web, pengurusan sesi adalah topik yang sangat penting. Ia boleh digunakan untuk menyimpan maklumat pengguna, mengesahkan identiti pengguna, mencegah serangan CSRF, dsb. Artikel ini akan memperkenalkan mekanisme pengurusan sesi dan aplikasinya dalam rangka kerja Gin.

1. Mekanisme pengurusan sesi

Dalam rangka kerja Gin, pengurusan sesi dilaksanakan melalui perisian tengah. Rangka kerja Gin menyediakan pakej sesi, yang merangkumi operasi yang diperlukan untuk pengurusan sesi. Sebelum menggunakan pakej sesi, anda perlu memasangnya terlebih dahulu Masukkan arahan berikut dalam terminal:

go get github.com/gin-contrib/sessions

Pakej sesi menyediakan empat kaedah pengurusan sesi: Kuki, storan memori, storan fail dan storan Redis. Antaranya, storan memori dan storan fail adalah lalai, dan storan Redis perlu memasang pakej redis-go-driver dan mengimport pakej dalam kod. Berikut menggunakan kaedah Kuki sebagai contoh untuk memperkenalkan pelaksanaan pengurusan sesi.

  1. Buat perisian tengah sesi
package main

import (
    "github.com/gin-contrib/sessions"
    "github.com/gin-contrib/sessions/cookie"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()

    // 设置会话中间件
    store := cookie.NewStore([]byte("secret"))
    router.Use(sessions.Sessions("mysession", store))

    router.GET("/set", setHandler)
    router.GET("/get", getHandler)

    router.Run(":8080")
}

func setHandler(c *gin.Context) {
    session := sessions.Default(c)
    session.Set("user", "John")
    session.Save()
    c.String(200, "Session saved.")
}

func getHandler(c *gin.Context) {
    session := sessions.Default(c)
    user := session.Get("user")
    c.String(200, "User is %v.", user)
}

Dalam kod di atas, kami mencipta perisian tengah sesi penyimpanan kuki dan mengikatnya pada enjin Gin. Antaranya, parameter pertama "mysession" mewakili nama sesi, dan parameter kedua []bait ("rahsia") ialah kunci, yang digunakan untuk menyulitkan nilai dalam kuki. Dalam setHandler, kami menggunakan kaedah session.Set() untuk menetapkan pasangan nilai kunci, dan kemudian memanggil kaedah session.Save() untuk menyimpan sesi. Dalam getHandler, kami menggunakan kaedah session.Get() untuk mendapatkan maklumat pengguna dan mengeluarkannya dalam respons.

  1. Pengurusan sesi ujian

Masukkan arahan berikut dalam terminal untuk memulakan perkhidmatan:

go run main.go

Masukkan alamat berikut dalam penyemak imbas:

http://localhost:8080/set

Kemudian masukkan:

http://localhost:8080/get

Anda boleh melihat maklumat respons ialah:

User is John.

Ini menunjukkan bahawa kami berjaya mencipta sesi dan menyimpan maklumat pengguna.

2. Aplikasi pengurusan sesi

Dalam aplikasi web, pengurusan sesi biasanya digunakan dalam senario berikut:

  1. Pengesahan pengguna

Pengesahan pengguna ialah salah satu senario yang paling biasa dalam aplikasi web Ia digunakan untuk menentukan sama ada pengguna dilog masuk dan sama ada pengguna mempunyai hak untuk mengakses sumber tertentu. Dalam rangka kerja Gin kami boleh menyimpan maklumat pengguna dalam sesi dan menyemaknya di mana sahaja pengesahan diperlukan. Berikut ialah contoh pengesahan pengguna yang mudah:

func authHandler(c *gin.Context) {
    session := sessions.Default(c)
    user := session.Get("user")
    if user == nil {
        c.Redirect(http.StatusFound, "/login")
        return
    }
    // 验证用户身份
    if user != "admin" {
        c.AbortWithStatus(http.StatusUnauthorized)
        return
    }
    c.String(200, "Hello, admin.")
}

Dalam kod di atas, kami mula-mula menggunakan kaedah session.Get() untuk mendapatkan maklumat pengguna, dan jika pengguna tidak log masuk, ubah hala ke halaman log masuk . Jika pengguna log masuk, sahkan bahawa mereka adalah pentadbir. Jika ia adalah pentadbir, "Helo, pentadbir adalah output, jika tidak 401 Tanpa Kebenaran dikembalikan.

  1. Cegah serangan CSRF

Pemalsuan Permintaan Merentas Tapak (pendek kata CSRF) ialah kaedah serangan web biasa yang mengeksploitasi mekanisme Kuki pelayar, memalsukan permintaan untuk mencapai tujuan serangan . Dalam rangka kerja Gin, kita boleh menggunakan sesi untuk menghalang serangan CSRF. Khususnya, pada setiap penyerahan borang, kami menambah medan csrf_token pada borang dan kemudian menyimpan medan dalam sesi. Pada setiap permintaan berikutnya, kami boleh menyemak sama ada token itu konsisten dengan apa yang disimpan dalam sesi. Berikut ialah contoh pertahanan CSRF yang mudah:

func csrfHandler(c *gin.Context) {
    session := sessions.Default(c)
    token := session.Get("csrf_token")
    if token == nil || token != c.PostForm("csrf_token") {
        c.AbortWithStatus(http.StatusBadRequest)
        return
    }
    // 处理表单提交
    c.String(200, "Form submitted.")
}

func formHandler(c *gin.Context) {
    session := sessions.Default(c)
    token := uuid.New().String()
    session.Set("csrf_token", token)
    session.Save()
    c.HTML(http.StatusOK, "form.html", gin.H{
        "csrf_token": token,
    })
}

Dalam kod di atas, kami mula-mula membandingkan nilai csrf_token dalam borang dengan nilai token yang disimpan dalam sesi. Jika ia tidak konsisten, kod status 400 Bad Request dikembalikan. Jika ia konsisten, penyerahan borang diproses dan "Borang diserahkan ialah output." Apabila borang dimuatkan, kami menggunakan pakej uuid untuk menjana nilai token unik, kemudian menyimpan nilai dalam sesi, dan akhirnya mengembalikan halaman borang kepada pengguna.

3. Ringkasan

Dalam artikel ini, kami memperkenalkan mekanisme pengurusan sesi dan aplikasinya dalam rangka kerja Gin. Pengurusan sesi ialah topik penting dalam pembangunan aplikasi web Ia boleh digunakan untuk menyimpan maklumat pengguna, mengesahkan identiti pengguna, mencegah serangan CSRF, dsb. Dalam rangka kerja Gin, kami boleh menggunakan perisian tengah untuk melaksanakan pengurusan sesi, dan pakej sesi memberikan kami antara muka operasi yang mudah. Dalam aplikasi praktikal, kami juga boleh menggabungkan modul berfungsi lain, seperti pengesahan, kebenaran, penyulitan, pengelogan, dll., untuk membina sistem aplikasi Web yang lebih lengkap.

Atas ialah kandungan terperinci Pengurusan sesi dan aplikasinya dalam rangka kerja Gin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn