代码之家  ›  专栏  ›  技术社区  ›  Lassi

在Go web app路由器中检查用户权限的最佳方法

  •  0
  • Lassi  · 技术社区  · 7 年前

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

    • 任何人都可以访问的(登录页面和静态资产)
    • 登录的可访问的常规用户和管理员
    • 只有登录的管理员才能访问

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

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

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

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

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   Franck Jeannin    7 年前

    写自己的并不难。假设您将admin令牌存储在名为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的原因,选项方法可能必须经过授权。

        2
  •  0
  •   Venantius    7 年前

    简而言之,就是编写中间件来处理授权。从长远来看,可以帮助您解决问题的一个较长的答案是,为端点和中间件一起使用适当的路由路径。例如,您可以使用 /api/admin 然后使用相关的管理身份验证中间件将路由器包装为单独的路由。