Cara menggunakan konteks untuk melaksanakan pengesahan permintaan dalam Go
Dalam aplikasi moden, pengesahan permintaan adalah bahagian yang sangat penting, ia boleh membantu kami memastikan bahawa hanya pengguna yang diberi kuasa boleh mengakses sumber yang dilindungi. Dalam Go, kami boleh menggunakan pakej konteks untuk melaksanakan pengesahan permintaan, yang menyediakan cara yang elegan dan cekap untuk menghantar nilai berkaitan permintaan.
Konsep teras pakej konteks ialah antara muka Konteks, yang mentakrifkan satu siri kaedah dan sifat untuk menghantar maklumat konteks permintaan. Dalam aplikasi praktikal, kami boleh menggunakan WithCancel, WithDeadline, WithValue dan kaedah lain untuk mencipta contoh Konteks baharu dan menyerahkannya kepada fungsi yang perlu mengakses konteks permintaan.
Berikut ialah contoh kod yang menggunakan konteks untuk melaksanakan pengesahan permintaan:
package main import ( "fmt" "net/http" "context" ) // HandlerFunc 是一个自定义的HTTP请求处理函数 type HandlerFunc func(http.ResponseWriter, *http.Request) // AuthMiddleware 是一个中间件,用于进行请求鉴权 func AuthMiddleware(next HandlerFunc) HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // 获取请求中的Token token := r.Header.Get("Authorization") // 验证Token是否有效 if checkToken(token) { // 创建新的Context实例,并附带上Token信息 ctx := context.WithValue(r.Context(), "token", token) // 执行下一个处理函数 next(w, r.WithContext(ctx)) } else { // 返回未授权的错误 http.Error(w, "Unauthorized", http.StatusUnauthorized) } } } // ProtectedHandler 是一个受保护的请求处理函数 func ProtectedHandler(w http.ResponseWriter, r *http.Request) { // 从Context中获取Token信息 token := r.Context().Value("token") // 打印Token信息 fmt.Println("Token:", token) // 返回请求已成功处理的消息 fmt.Fprintln(w, "Request handled successfully") } // 用于验证Token的辅助函数 func checkToken(token string) bool { // 这里简单地判断Token是否为空 return token != "" } func main() { // 创建一个HTTP服务器 server := http.Server{ Addr: ":8080", Handler: AuthMiddleware(ProtectedHandler), } // 启动服务器 server.ListenAndServe() }
Dalam kod sampel di atas, kami mula-mula mentakrifkan fungsi pemprosesan permintaan HTTP tersuai HandlerFunc
, dan kemudian menentukan Middleware HandlerFunc
,然后通过定义一个中间件AuthMiddleware
来实现请求鉴权功能。
在AuthMiddleware
中,我们从请求头中获取Authorization
字段的值作为Token,并使用checkToken
函数验证Token的有效性。如果Token有效,我们就通过context.WithValue
方法创建一个新的Context实例,并附带上Token信息。然后,我们通过执行下一个处理函数next
,将新的Context实例传递给它。
在ProtectedHandler
中,我们通过r.Context().Value("token")
从Context中获取Token信息,并进行后续的处理。
最后,在main
函数中,我们创建了一个HTTP服务器,并将AuthMiddleware
作为中间件应用到ProtectedHandler
AuthMiddleware
, kami mendapat nilai medan Authorization
daripada pengepala permintaan sebagai Token dan menggunakan fungsi checkToken
untuk mengesahkan kesahihan Token. Jika Token itu sah, kami mencipta contoh Konteks baharu melalui kaedah context.WithValue
dan melampirkan maklumat Token. Kami kemudian menghantar contoh Konteks baharu kepadanya dengan melaksanakan fungsi pengendali seterusnya next
. Dalam ProtectedHandler
, kami memperoleh maklumat Token daripada Context melalui r.Context().Value("token")
dan melakukan pemprosesan seterusnya. 🎜🎜Akhir sekali, dalam fungsi utama
, kami mencipta pelayan HTTP dan menggunakan AuthMiddleware
sebagai middleware kepada ProtectedHandler
, supaya Setiap kali permintaan tiba , ia akan diproses terlebih dahulu oleh perisian tengah pengesahan. 🎜🎜Melalui contoh di atas, kita dapat melihat bahawa menggunakan konteks untuk melaksanakan pengesahan permintaan adalah sangat mudah dan elegan. Ia bukan sahaja menyediakan cara umum untuk menghantar maklumat konteks permintaan, tetapi juga memudahkan beberapa pemprosesan logik tambahan. Dalam aplikasi praktikal, kami boleh memanjangkan contoh ini mengikut keperluan dan menambah lebih banyak logik pengesahan dalam perisian tengah untuk memenuhi keperluan kami. 🎜Atas ialah kandungan terperinci Cara menggunakan konteks untuk melaksanakan pengesahan permintaan dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!