使用Keycloak实现ActiveMQ Artemis授权遇LoginModule缺失问题求助
我正在开展一项实验:尝试通过Keycloak实现ActiveMQ Artemis的授权功能,预期效果为用户访问8161端口时跳转至Keycloak授权页面,经Keycloak验证权限通过后进入Artemis网页。
本地配置完成后,Artemis容器日志出现以下错误:
2024-11-07 14:30:53,852 WARN [io.hawt.system.JaasAuthenticator] Login failed due to: No LoginModule found for org.keycloak.adapters.jaas.DirectAccessGrantsLoginModule
同时启动容器时日志显示:
2024-11-07 14:30:52,454 INFO [io.hawt.web.auth.keycloak.KeycloakServlet] Keycloak integration is disabled
我已配置docker-compose.yml、keycloak.json及login.config(具体内容如下),但无法定位问题,也不清楚如何启用Keycloak集成。
配置文件
docker-compose.yml
version: '3' services: keycloak: image: quay.io/keycloak/keycloak:24.0.0 container_name: keycloak restart: unless-stopped environment: - KC_BOOTSTRAP_ADMIN_USERNAME=admin - KC_BOOTSTRAP_ADMIN_PASSWORD=admin - KC_HOSTNAME_ADMIN=http://localhost:8080 - KC_HOSTNAME=http://localhost:8080 - KC_METRICS_ENABLED=true - KC_HEALTH_ENABLED=true - KC_DB=postgres - KC_DB_PASSWORD=password - KC_DB_SCHEMA=public - KC_DB_USERNAME=keycloak - KC_DB_URL_HOST=postgres - KC_DB_URL_DATABASE=keycloak - KC_LOG_LEVEL=ALL depends_on: - postgres ports: - "8080:8080" command: start-dev volumes: - ./keycloak_data/auth/import:/opt/keycloak/data/import postgres: image: postgres:15.0 container_name: postgres-keycloak restart: unless-stopped environment: POSTGRES_DB: keycloak POSTGRES_USER: keycloak POSTGRES_PASSWORD: password ports: - "5436:5432" volumes: - ./postgres_data:/var/lib/postgresql/data artemis: image: apache/activemq-artemis:2.37.0 container_name: artemis restart: unless-stopped environment: - KEYCLOAK_ENABLED=true - ARTEMIS_USER=admin - ARTEMIS_PASSWORD=admin ports: - "8161:8161" - "61616:61616" volumes: - ./artemis_data:/var/lib/artemis/etc
keycloak.json
{ "realm": "artemis", "resource": "artemis-web", "auth-server-url": "http://localhost:8080/", "use-resource-role-mappings": true, "principal-attribute": "preferred_username", "ssl-required": "external", "credentials": { "secret": "DD91ch9wpGbs2gRkMjsp3sdabt52mQlc" } }
login.config
activemq { org.keycloak.adapters.jaas.DirectAccessGrantsLoginModule required keycloak-config-file="/var/lib/artemis-instance/etc/keycloak.json" role-principal-class=org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal; org.apache.activemq.artemis.spi.core.security.jaas.PrincipalConversionLoginModule required principalClassList=org.keycloak.KeycloakPrincipal; };
问题排查与解决方案
1. 修正Artemis配置挂载路径(核心问题)
当前docker-compose.yml中Artemis的volumes挂载路径错误,容器内/var/lib/artemis/etc并非实例配置目录,正确路径应为/var/lib/artemis-instance/etc。修改后:
volumes: - ./artemis_data:/var/lib/artemis-instance/etc
此修改可确保keycloak.json、login.config被放置到Artemis能识别的路径下。
2. 补充Keycloak JAAS依赖包
日志中No LoginModule found错误,是因为Artemis容器默认未包含Keycloak适配器jar包:
- 下载与Keycloak 24.0.0匹配的
keycloak-jaas-adapter-24.0.0.jar - 在本地创建
./artemis_data/lib目录,将jar包放入其中 - 为Artemis服务添加lib目录挂载:
volumes: - ./artemis_data:/var/lib/artemis-instance/etc - ./artemis_data/lib:/var/lib/artemis-instance/lib
3. 启用Hawtio的Keycloak集成
编辑./artemis_data/bootstrap.xml,在web节点的console应用中添加Keycloak配置:
<web bind="http://0.0.0.0:8161" path="web"> <app url="activemq-branding" war="activemq-branding.war"/> <app url="artemis-plugin" war="artemis-plugin.war"/> <app url="console" war="console.war"> <property name="keycloakEnabled" value="true"/> <property name="keycloakConfigFile" value="/var/lib/artemis-instance/etc/keycloak.json"/> </app> </web>
4. 重启容器生效
执行命令重启Artemis容器:
docker-compose restart artemis
内容的提问来源于stack exchange,提问作者Nestor Технович

