【问题标题】:IBM MQ - I can't subscribe to topic using wildcard syntaxIBM MQ - 我无法使用通配符语法订阅主题
【发布时间】:2020-11-01 16:05:08
【问题描述】:

我在 IBM MQ docker 版本上创建了以下主题:

开发/测试/sys1 开发/测试/sys2

我正在尝试使用以下代码从 XMS .NET API 创建订阅者:

destination = sessionWMQ.CreateTopic("dev/test/#");

出现以下异常,它与基于权限的“原因:2035”有关,但我无法弄清楚我必须授予的权限是什么以及从哪里授予

XMSException 被捕获:IBM.XMS.IllegalStateException:未能 使用 MQSUB 订阅主题 dev/#。可能有问题 由于它被另一条消息使用而创建订阅 消费者。确保使用此订阅的任何消息消费者都是 在尝试以相同名称创建新订阅之前关闭。 有关详细信息,请参阅链接的异常。

【问题讨论】:

  • 我找到了解决方案,我必须授予用户对以下系统主题 SYSTEM.BASE.TOPIC 的权限
  • 出于测试目的,可以授予 SYSTEM.BASE.TOPIC 权限。授予 SYSTEM.BASE.TOPIC 权限意味着您允许每个人订阅基本主题下的任何主题。这将是一个安全问题。您需要创建主题对象并授予需求权限。
  • 啊 - cmets - 没关系 - 我在看到 cmets 之前已经写好了答案。

标签: ibm-mq


【解决方案1】:

如果您收到错误 2035 (MQRC_NOT_AUTHORIZED),队列管理器错误日志AMQERR01.LOG 中将有相应的消息。它会这样说:-

AMQ8009: Entity 'mqgusr1' has insufficient authority to access topic string
'dev/test/#'.

EXPLANATION:
The specified entity is not authorized to access the required topic. The
following requested permissions are unauthorized: sub
ACTION:
Ensure that the correct level of authority has been set for this entity against
appropriate topic objects, or ensure that the entity is a member of a privileged
group. 

具体来说,此错误消息将告诉您用户 ID、对象名称和缺少的授权。使用这些信息,您可以几乎构建您需要的命令。您确实需要更多信息,那就是您希望授予权限的用户所在的组名。始终建议您在授予权限时使用组名而不是用户名,否则您最终可能会获得太多权限来管理,或者更糟糕的是,由于主要组用户类似于“员工”。

这是命令,假设我的错误消息中的“mqgusr1”位于组“mqgapp”中,并且该组适合被授予订阅主题的权限。

SET AUTHREC PROFILE(SYSTEM.BASE.TOPIC) OBJTYPE(TOPIC) GROUP('mqgapp') AUTHADD(SUB)

此时值得一提的是,将主题相关权限添加到 SYSTEM.BASE.TOPIC 会导致相关组能够使用 any 可用主题 - 此对象表示主题树。如果您希望仅访问主题树的某些部分(推荐),那么您应该为要使用的主题树的部分创建一个主题对象,然后在此处授予权限,因此以下命令:

SET AUTHREC PROFILE(SYSTEM.BASE.TOPIC) OBJTYPE(TOPIC) GROUP('mqgapp') AUTHRMV(SUB)
DEFINE TOPIC(DEV.TEST) TOPICSTR('dev/test')
SET AUTHREC PROFILE(DEV.TEST) OBJTYPE(TOPIC) GROUP('mqgapp') AUTHADD(SUB)

【讨论】:

  • 我发现最好使用DELETE AUTHREC PROFILE(SYSTEM.BASE.TOPIC) OBJTYPE(TOPIC) GROUP('mqgapp') 之类的东西而不是AUTHRMV 唯一的权限。区别在于使用DELETE 删除记录与留下没有权限的记录。如果我真的想要一个没有权限的记录从更具体的对象中删除一些权限,我希望至少保留一些权限,例如INQDSP,这允许amqoamddmpmqaut-e还有东西要展示。
  • 嗨@JoshMc,是的,如果您知道要删除所有权限而不仅仅是一个权限,这当然更合适。不幸的是,我不知道这是否属实,因为我只知道问题中提到的系统的一小部分,建议删除超出答案所需的内容是不明智的。
  • 我认为您的意图是撤消您之前在问题中提供的“SET AUTHREC”。
  • @JoshMc,是的,但我不知道该组是否对该主题具有使用 DELETE AUTHREC 命令将删除的其他权限。我只是认为写一个可以撤消的答案是危险的。
  • 感谢@MoragHughson,但是当我从SYSTEM.BASE.TOPIC 中删除权限时,我无法使用通配符方案destination = sessionWMQ.CreateTopic("dev/test/#"); 订阅主题我收到以下异常 MQ8009W:实体“app”没有足够的权限访问主题字符串“dev/test/#”。 [CommentInsert1(app), CommentInsert2(dev/test/#), CommentInsert3(sub)] 我授予用户应用程序对开发/主题和开发/测试主题的所有可用权限,但它不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多