【问题标题】:ActiveMQ authorizationActiveMQ 授权
【发布时间】:2012-07-14 17:44:22
【问题描述】:

如果我想在Apache ActiveMQ上实现JAAS授权,是否必须使用activemq.xml配置文件中的插件?

这种方式确实不好,因为如果我想更改授权,我必须更改 activemq.xml 文件并重新启动服务器才能工作。

有什么方法可以通过更改其他属性文件而不是 activemq.xml 文件来使用 JAAS 身份验证?或者我可以自定义我自己的授权插件吗?

谢谢。

【问题讨论】:

  • 或者我可以自定义我自己的授权插件吗?
  • 我刚刚开始开发自定义授权插件。我的目标是将授权规则粘贴在文件中(即 auhorization.properties)并定期检查文件的更新。您最终找到了可行的解决方案吗? activemq 授权库没有很好的文档记录,所以我很难理解它是如何工作的。
  • 我能够修改 activemq.xml 代理定义以允许它自动获取对配置的更改 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="${HOSTNAME}" dataDirectory="${activemq.data}" start="false"> 最后一个属性 start="false" 是重要的
  • 补充 ted-k42 所说的话:activemq.apache.org/runtime-configuration.html。这是在 5.9.0 中添加的。

标签: java authorization activemq jaas


【解决方案1】:

每当我设置 ActiveMQ 安全性时,我发现最好使用简单的 AuthorizationPluginwildcards 来表示所覆盖的目的地(这就是为什么在队列和主题中使用命名约定非常方便的原因)。这个想法是您定义少数用户组并授予他们访问这些目的地的权限。

从用户名分配组的角色由身份验证插件之一处理 - JAAS 插件对于将这些信息外部化到 LDAP 目录中的 ActiveMQ 配置之外特别有用。

查看 FuseSource 的 ActiveMQ Security Guide(需要注册)了解更多信息。

2018-07-02 更新 ActiveMQ Security Guide,现在位于 redhat。

【讨论】:

  • 我正在使用 JAAS 插件进行身份验证。但是对于我的应用程序,将一直创建具有不同名称的新主题,因此我认为使用通配符对我的应用程序来说是不够的。但是授权插件是实现 ActiveMQ 授权的唯一途径吗?
  • 为新创建的队列和主题定义命名约定非常简单。如果您因为不知道将如何使用您的代理而无法定义一个,那么您以后可能会遇到更深层次的问题。有两个授权插件,但它们都是在通过通配符授予对资源的访问权限的基础上工作的——如果您可以将创建这些目标的代码与 LDAP 条目一起授予访问权限,那么 LDAP 可能更适合您的需求。虽然这个要求给人一种建筑的味道。
  • 好吧,你说的我明白了。但对我来说,题目的名字实在是难以预料。我想我可能需要以另一种方式满足我的要求。嗯,ActiveMQ 确实需要改进,不是吗? :D
  • 多租户如何,需要定期设置新用户和组?除了使用自定义插件之外,有没有办法在“{group}.>”等授权规则中使用占位符?在这种情况下,单独的通配符没有帮助。
  • 你能举例说明如何使用java动态添加用户名和密码吗?
【解决方案2】:

我发现一些代码 sn-ps 最终对开始研究这个主题非常有帮助:

http://activemq.2283324.n4.nabble.com/Fully-programmatic-authorization-map-tp2344815.html

这是我最终使用它的方式(可能不是最好的方式):

public class TestAuthorizationPlugin extends AuthorizationPlugin {

然后:

@Override
public Broker installPlugin(Broker broker) {
    List<DestinationMapEntry> entries = new ArrayList<DestinationMapEntry>(); 
    try {
        entries.add(makeTopicAuthorization("groupA.topic", "groupA", "groupA", "groupA"));
        entries.add(makeQueueAuthorization("groupA.queue", "groupA", "groupA", "groupA"));
        entries.add(makeQueueAuthorization("groupB.queue", "groupB", "groupB", "groupB"));
        entries.add(makeTopicAuthorization("ActiveMQ.Advisory.>", "all", "all", "all"));
        AuthorizationMap authMap = new DefaultAuthorizationMap(entries);
        return new AuthorizationBroker(broker, authMap);
    } catch (Exception e) {
        LOGGER.error(e);
    } 

    return new AuthorizationBroker(broker, null);
}

将其放入&lt;activemq_home&gt;/lib/

修改activemq.xml:

<plugins>
    <!--  use JAAS to authenticate using the login.config file on the classpath to configure JAAS -->
    <jaasAuthenticationPlugin configuration="activemq" />

    <!-- Authorization control -->
    <bean xmlns="http://www.springframework.org/schema/beans" class="com.blackstrype.activemq.security.TestAuthorizationPlugin"/>
</plugins>

另一个有用的链接,了解更多关于 autho plugin dev 的信息:

http://mariuszprzydatek.com/2014/01/04/token-based-authentication-plugin-for-activemq/

【讨论】:

  • 我试图做一个类似的实现,但我试图建立的连接都是使用 ActiveMQ.Advisory。> 因此,auth map 总是映射到'all'
  • 是的,我还没有真正找到解决这个问题的聪明方法。三个理论选项:1) 禁用顾问 2) 将所有用户放在对顾问具有完全身份验证的组中。 3)为每个消息授权的咨询主题创建一个随附的规则(不知道这是否真的可能)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2016-05-08
  • 2011-08-05
  • 1970-01-01
  • 2013-11-01
  • 2016-12-17
  • 1970-01-01
相关资源
最近更新 更多