gpt4 book ai didi

Web 应用程序中的 Go- 身份验证逻辑模式

转载 作者:IT王子 更新时间:2023-10-29 01:36:31 25 4
gpt4 key购买 nike

我想在用 golang 编写的网络应用程序中确定一个简单而有用的用户身份验证模式。

我想出了两种模式。第一个是使程序员能够将他的功能从身份验证逻辑中分离出来,并且在 main() 中有更清晰的 HandleFunc 部分,只有通过找到 main 才能看到() 查看哪些部分受认证控制。

第二个是让程序员在每个处理身份验证所需 url 的函数中包含一个决定。 if 语句通过在别处定义的 authp() 函数进行检查。

对于这种需要,哪种模式更好?

这项工作的更好模式是什么?

是否有可能将一个函数传递给 http.HandleFunc,它的签名不是 func urlFunc (ResponseWriter, *Request) bu like func urlFunc (successFunc, failFunc)func urlFunc (ResponseWriter, *Request, successFunc, failFunc) 如下面 First WayauthenticationGateKeeper 功能,如果不是合适的解决方法那个?

//First Way
package main

func authGateKeeper(successFunc, failFunc) {
if (authp()) {
successFunc
} else {
failFunc
}
}

func authp() boolean {
//authentication logic, db query, or session check etc.
}

//usage in main
http.HandleFunc("/", authGateKeeper)



//Second Way; other alternative, in each function check pattern
func f(w, r) {
if (authp()) {
//function's processes
} else {
//the fail case function or processes
}
}

func authp() boolean {
//authentication logic, db query, or session check etc.
}

//usage in main
http.HandleFunc("/", f)

最佳答案

有很多方法可以解决这个问题,是否有一个完全“更好”是有争议的。我强烈建议编写一些中间件来包装您的路由并强制执行检查,仅在成功时调用包装的处理程序。

请注意,我将在这里做一些假设,因为您还没有告诉我们您如何管理 session (cookies?服务器端?)和/或在身份验证之上您可能需要什么样的授权.

// Middleware - a function that sits in the 'middle' of your request processing.
func RequireAuth(h http.Handler) http.Handler) {
fn := func(w http.ResponseWriter, r *http.Request) {
// Assuming gorilla/sessions
session, err := store.Get("name", r)
if err != nil {
// Raise HTTP 500
return
}

// We'll assume you're storing the userID in the cookie|server session
// upon login elsewhere.
id := session.Values["userID"]
// Probably returns a *yourapp.User
user, err := db.GetUser(id)
if err != nil {
// Raise HTTP 500
return
}

if user == nil {
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
// Don't forget these 'naked' returns - if you miss one, your
// handler will keep processing beyond the error and result in
// unintended side effects
return
}

// Further checks here - i.e. checking user.Active == true, etc.

// The userID matches one in the DB, so let's proceed
h.ServeHTTP(w, r)
}

return http.HandlerFunc(fn)
}

// And in your router - assuming just vanilla net/http
http.Handle("/", RequireAuth(yourHandlerFunc))
http.Handle("/", RequireAuth(someOtherHandler))
// Note that using gorilla/mux or goji can help give you "subrouters" so you
// don't have to wrap every single route with your middleware (messy, error prone)

我还建议阅读一些关于 Go 中间件的文章 1组成2这将对您的 future 有所帮助。

如果您想调用自定义错误页面,只需编写一个处理程序 - 例如UnauthorizedHandler 满足 http.Handler 并且只调用 UnauthorizedHandler.ServeHTTP(w, r) 而不是 http.Error

关于Web 应用程序中的 Go- 身份验证逻辑模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30686458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com