rabbitMQ使用SpringCloud Oauth2 的jwt鉴权

rabbitMQ使用SpringCloud Oauth2 的jwt鉴权,第1张

rabbitMQ使用SpringCloud Oauth2 的jwt鉴权 想要达到的目的

项目master向mq中的队列1,2,3发送不同的消息,项目slave1,slave2,slave3分别订阅队列1,2,3的消息。
这些slave项目只能订阅自己队列的消息,不能订阅其他队列的消息。
简单的做法是创建三个不同的虚拟主机(vhost),用不同的账号分给slave项目。缺点就是如果队列和项目是动态增加的,就很麻烦。

rabbitmq_auth_backend_oauth2

翻了一下rabbitmq官网,发现了这个插件rabbitmq_auth_backend_oauth2。

3.8以上的版本会内置这个插件,但也是需要打开才可以使用。

1.启用rabbitmq_auth_backend_oauth2插件:

进入到mq的bin目录下
rabbitmq-plugins list 可以列出所有的插件

前边带E的是已经启用的插件,我这里已经启用rabbitmq_auth_backend_oauth2插件,
启用命令是: rabbitmq-plugins enable rabbitmq_auth_backend_oauth2
没有报错就可以

2.查看配置

在mq的启动日志里会打印配置的路径

如果没有可以参考官方文档修改配置滤镜:https://www.rabbitmq.com/configure.html

配置有两种种rabbitmq.conf和advanced.config,rabbitmq.conf是官方推荐的新的配置格式但是对于复杂的配置他是搞不定的,这时候就要用到advanced.config,咱们要用的rabbitmq_auth_backend_oauth2插件就要用advanced.config

思考一下mq使用业务系统中的jwt需要配置什么,jwt是无状态的这点无需多说。mq只需要有能力校验jwt的有效性就可以工作了,其次jwt中的权限标识key需要告诉mq而且value也要符合mq的标准。

官方的文档是这样介绍的:

这里我使用的jtw是非对称加密的方式:

对外提供获取公钥的接口:

这里注意一点:keyId,因为可以给mq配置多个密钥集,他是根据这个leyId区分使用哪个公钥验证你的jwt
当然可以直接把公钥写到mq的配置里,非对称加密也可以把密钥写到mq的配置里。可以参考官方文档:
https://github.com/rabbitmq/rabbitmq-server/tree/master/deps/rabbitmq_auth_backend_oauth2

3 修改配置

接下来是修改mq的advanced.config配置:

[
  {rabbit, [
    %% 这里是配置认证的方式,这样配置会先使用oauth2认证,失败后再使用internal (原本的账号密码)认证
    {auth_backends, [rabbit_auth_backend_oauth2, rabbit_auth_backend_internal]}
  ]},
  
	  {rabbitmq_auth_backend_oauth2, [
	  %% 这里配置使用jwt中的那个字段作为权限字段,默认是scope,这样配之后会把scope和authorities中的内容合并当作认证字段
     	{ extra_scopes_source , << "authorities" >>},
	    {key_config, [
	    %% 这里配置默认使用那个公钥验证jwt 与上边提到的kid要一致,不写的话要在jwt中有这个属性
   		  {default_key, <<"kid">>},
	      {jwks_url, <<"公钥获取地址,必须是https">>}
	    ]}
	  ]}
].

这上边的配置里边的<<这样的尖括号不要删,虽然很奇怪

这里是我的公钥访问结果

4.访问

使用业务中的jwt当作密码即可访问mq

这是我的jwt解析内容:

注意aud字段是必须的

5.权限内容说明


我实验了一下read的权限
read:*/*/*
第一个*是虚拟主机 第二个是队列名称
如果有特殊字符还需要转译:例如/主机名称要用%2F/

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5683148.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存