当前位置: 首页 > 工具软件 > gnatsd > 使用案例 >

消息系统nats(gnatsd)的自定义鉴权扩展

云星波
2023-12-01

因为对mqtt服务器mosquitto的源码简单研究感觉其性能在多处都有瓶颈比如网络层没有使用epoll,topic使用树(在大量topic时岂不是要遍历到死)还有很多……,所以又去网上搜索其他消息系统的资料,然后发现gnatsd的性能很牛逼,虽然功能上比mqtt弱,但是在某种程度上可能也可以契合我的项目。
首先我想了解一下gnatsd的鉴权系统,一开始发现都是写在配置文件里,这样对于少量的用户是可以的或者大量用户时共享密码和权限,但是如果想对所有用户都使用不同的密码和权限控制就不行了。

自定义鉴权解决方案


还没开始正式使用,都没下载代码只是简单在github上查看了一下代码最终发现一个解决方案:

server/auth.go:
// Authentication is an interface for implementing authentication
type Authentication interface {
    // Check if a client is authorized to connect
    Check(c ClientAuthentication) bool
}
server/auth.go:
if s.opts.CustomRouterAuthentication != nil {
        return s.opts.CustomRouterAuthentication.Check(c)
    }
server/opts.go:
CustomClientAuthentication Authentication `json:"-"`

auto.go中进行鉴权,每次都先判断如果CustomRouterAuthentication不为空则执行CustomRouterAuthentication.Check进行鉴权。

CustomRouterAuthentication实现Authentication接口的Check方法。


所以在server初始化时,传入一个自定义的CustomClientAuthentication即可,例如:

opts := DefaultOptions()
opts.CustomClientAuthentication = &clientAuth
s := RunServer(opts)

自定义的鉴权类可以模仿mosquitto auth plugin插件使用查询数据库进行鉴权,比如查Redis。


附Issues中关于鉴权的讨论:
Enable external Authentication (authn) and Authorization (authz) via Extensible Auth Provider. #434

 类似资料: