代理模式通过代理对象控制对真实对象的访问,首先定义统一接口Resource,再由RealResource实现具体逻辑,ProxyResource持有RealResource引用并在Access方法中进行权限校验,允许admin和editor访问,其他用户被拒绝,从而实现权限控制与业务逻辑分离。

在Go语言中,代理模式(Proxy Pattern)常用于控制对某个对象的访问,比如加入权限校验、日志记录或延迟初始化。实现代理模式控制访问权限的核心思路是:通过一个代理对象包装真实对象,在调用真实方法前进行权限判断。
定义接口统一行为
为了让代理对象和真实对象可以互换使用,先定义一个公共接口:
type Resource interface { Access(userID string) string}
这个接口表示一个受保护资源,只有特定用户才能访问。
实现真实资源对象
真实对象实现具体逻辑,不关心权限控制:
立即学习“go语言免费学习笔记(深入)”;
Modoer多功能点评系统2.5 精华版 Build 20110710 GBK
Modoer 是一款以本地分享,多功能的点评网站管理系统。采用 PHP+MYSQL 开发设计,开放全部源代码。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱,不局限于商铺类点评,真正实现了多类型的点评,可以让您的网站点评任何事与物,同时增加产品模块,也更好的网站产品在网站上展示。Modoer点评系统 2.5 Build 20110710更新列表1.同步 旗舰版系统框架2.增加 限制图片
0 查看详情
type RealResource struct{}func (r *RealResource) Access(userID string) string { return "敏感数据已访问,用户:" + userID}
实现代理进行权限检查
代理对象持有真实对象的引用,并在调用前进行权限验证:
type ProxyResource struct { realResource *RealResource allowedUsers map[string]bool}func NewProxyResource() *ProxyResource { return &ProxyResource{ realResource: &RealResource{}, allowedUsers: map[string]bool{ "admin": true, "editor": true, }, }}func (p *ProxyResource) Access(userID string) string { if !p.allowedUsers[userID] { return "拒绝访问:用户 " + userID + " 权限不足" } return p.realResource.Access(userID)}
使用示例
客户端代码无需知道使用的是代理还是真实对象:
func main() { resource := NewProxyResource() fmt.Println(resource.Access("admin")) // 允许访问 fmt.Println(resource.Access("guest")) // 拒绝访问}
这种方式将权限控制逻辑与业务逻辑分离,符合单一职责原则。代理模式在需要统一鉴权、审计或远程资源访问控制时非常实用。
基本上就这些,结构清晰且易于扩展。
以上就是如何在Golang中实现代理模式控制访问权限的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1027352.html
微信扫一扫
支付宝扫一扫