gpt4 book ai didi

go - 在 Go 网络应用程序路由器中检查用户权限的最佳方法

转载 作者:IT王子 更新时间:2023-10-29 02:28:50 25 4
gpt4 key购买 nike

我的网络应用程序具有三个访问级别的 URL:

  • 任何人都可以访问的(登录页面和静态 Assets )
  • 可访问的普通用户和已登录的管理员
  • 只有登录的管理员才能访问

我应该为我的路由器中的每个 URL 模式指定最低访问级别,以便阻止低于该级别的人。 (我想他们应该得到 HTTP 错误 401 或 403。)

如何最好地实现这些检查,以便我不必记住将它们分别放在每个 URL 处理程序函数中(这很容易忘记)?理想情况下,我想做这样的事情:

router.Get("/someRegularPage", regularAccess(handleSomeRegularPage))
router.Get("/someAdminPage", adminAccess(handleSomeAdminPage))
router.Get("/", publicAccess(handleLoginPage))

是否有一些半标准的中间件可以做到这一点,它是如何工作的?自己编写有多难?

此外,如果默认权限是拒绝所有人访问,以防我忘记为某些 URL 指定访问级别,那就太好了。编译器警告或错误是理想的。

最佳答案

自己编写并不难。假设您将管理 token 存储在名为 ADMINTOKEN 的环境变量中:

func AdminOnly(f func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, Authorization")
if r.Method == "OPTIONS" {
f(w, r)
return
}

h := r.Header.Get("Authorization")
token := strings.TrimPrefix(h, "Bearer ")
if token == os.Getenv("ADMINTOKEN") {
f(w, r)
return
}

http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
}
}

由于 CORS,OPTIONS 方法可能必须被授权。

关于go - 在 Go 网络应用程序路由器中检查用户权限的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49730556/

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