注意:这绝对不是保护 REST API 的正确方法 , 我建议您考虑使用 JWT 或 OAuth2 来实现该目标!所以 , 让我们分解一下并尝试了解发生了什么!
我们创建了一个名为的新装饰器函数isAuthorized() , 它接收一个与原始homePage函数具有相同签名的函数 。然后返回一个http.Handler.
在我们的isAuthorized()函数体中 , 我们返回一个 new http.HandlerFunc来验证我们的Authorized header的工作是 set 和 equals true 。现在 , 这是一个大大简化的版本OAuth2身份验证/授权 , 有一些细微的差异 , 但它让您大致了解它是如何工作的 。
然而 , 要注意的关键是我们已经设法装饰现有端点并在所述端点周围添加某种形式的身份验证 , 而无需更改该功能的现有实现 。
现在 , 如果我们要添加一个我们想要保护的新端点 , 我们可以轻松地这样做:
// define our newEndpoint function. Notice how, yet again,// we don't do any authentication based stuff in the body// of this functionfunc newEndpoint(w http.ResponseWriter, r *http.Request) {fmt.Println("My New Endpoint")fmt.Fprintf(w, "My second endpoint")}func handleRequests() {http.Handle("/", isAuthorized(homePage))// register our /new endpoint and decorate our// function with our isAuthorized Decoratorhttp.Handle("/new", isAuthorized(newEndpoint))log.Fatal(http.ListenAndServe(":8081", nil))}
这突出了装饰器模式的主要优点 , 在我们的代码库中包装代码非常简单 。我们可以使用相同的方法轻松添加新的经过身份验证的端点结论希望本教程有助于揭开装饰器的神秘面纱 , 以及如何在自己的基于 Go 的程序中使用装饰器模式 。我们了解了装饰器模式的好处以及如何使用它来用新功能包装现有功能 。
在本教程的第二部分 , 我们查看了一个更现实的示例 , 说明如何在自己的生产级 Go 系统中使用它 。
如果您喜欢本教程 , 请随时广泛分享这篇文章 , 它确实对网站有帮助 , 我将不胜感激!如果您有任何问题和/或意见 , 请在下面的评论部分告诉我!
推荐阅读
- 土耳其红茶茶器,红茶在土耳其的历史
- 古董瓷器的收藏价值如何
- 怎么判断云服务器流量是不是超限?有哪些解决的办法?
- 云服务器总是提示空间不足,我需要做哪些事?
- 云服务器和虚拟主机有什么区别?
- 有经验的网络工程师,为什么不用192.168.X.1作为路由器的IP?
- 代理用于SEO实践场景介绍
- 中继器、集线器、网桥、交换机、路由器、网关大总结,通俗易懂
- 路由器、交换机、光猫、WiFi、AP的相关知识,你真的都了解吗?
- 服务器的1U、2U、4U是指什么?