【问题标题】:Best way to check user permissions in a Go web app router在 Go Web 应用路由器中检查用户权限的最佳方法
【发布时间】:2018-04-09 10:15:11
【问题描述】:

我的 Web 应用具有三个访问级别的 URL:

  • 任何人都可以访问的内容(登录页面和静态资产)
  • 那些可访问的普通用户和登录的管理员
  • 只有登录的管理员才能访问

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

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

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

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

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

【问题讨论】:

  • 编写测试以确保您没有忘记。作为奖励,您知道您的中间件确实有效。

标签: go web permissions middleware


【解决方案1】:

自己编写并不难。假设您将管理员令牌存储在名为 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)
    }
}

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

【讨论】:

【解决方案2】:

简短的回答是编写中间件来处理授权。从长远来看,一个更长的答案可能对您有同样的帮助,那就是在该中间件旁边为您的端点使用适当的路由路径。例如,您可以为所有管理路由添加前缀 /api/admin,然后使用相关的 admin-auth 中间件为单个路由包装路由器。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2014-03-06
    • 1970-01-01
    • 2019-12-28
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2011-02-28
    相关资源
    最近更新 更多