Skip to content

Commit 7474d00

Browse files
committed
ARTEMIS-5830 - add jaas config to broker properties
1 parent d8abed4 commit 7474d00

File tree

10 files changed

+496
-8
lines changed

10 files changed

+496
-8
lines changed

artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,4 +1538,6 @@ default String resolvePropertiesSources(String propertiesFileUrl) {
15381538
default boolean isUsingDatabasePersistence() {
15391539
return getStoreConfiguration() != null && getStoreConfiguration().getStoreType() == StoreConfiguration.StoreType.DATABASE;
15401540
}
1541+
1542+
Map<String, JaasAppConfiguration> getJaasConfigs();
15411543
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.activemq.artemis.core.config;
18+
19+
import javax.security.auth.login.AppConfigurationEntry;
20+
import java.io.Serializable;
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
import java.util.Objects;
24+
25+
public class JaasAppConfiguration implements Serializable {
26+
27+
private static final long serialVersionUID = -651209063030767325L;
28+
29+
private String name;
30+
31+
private List<JaasAppConfigurationEntry> modules = new ArrayList<>();
32+
33+
public JaasAppConfiguration() {
34+
}
35+
36+
public String getName() {
37+
return name;
38+
}
39+
40+
public JaasAppConfiguration setName(String name) {
41+
this.name = name;
42+
return this;
43+
}
44+
45+
public List<JaasAppConfigurationEntry> getModules() {
46+
return modules;
47+
}
48+
49+
// help the properties setter
50+
public JaasAppConfiguration addModule(JaasAppConfigurationEntry entry) {
51+
modules.add(entry);
52+
return this;
53+
}
54+
55+
public static AppConfigurationEntry[] asAppConfigurationEntry(JaasAppConfiguration jaasAppConfiguration) {
56+
if (jaasAppConfiguration == null) {
57+
return null;
58+
}
59+
AppConfigurationEntry[] entries = new AppConfigurationEntry[jaasAppConfiguration.getModules().size()];
60+
for (int i = 0; i < jaasAppConfiguration.getModules().size(); i++) {
61+
JaasAppConfigurationEntry jaasAppConfigurationEntry = jaasAppConfiguration.getModules().get(i);
62+
entries[i] = new AppConfigurationEntry(jaasAppConfigurationEntry.getLoginModuleClass(), jaasAppConfigurationEntry.getLoginModuleControlFlag(), jaasAppConfigurationEntry.getParams());
63+
}
64+
return entries;
65+
}
66+
67+
@Override
68+
public boolean equals(Object o) {
69+
if (o == null || getClass() != o.getClass()) return false;
70+
JaasAppConfiguration that = (JaasAppConfiguration) o;
71+
return Objects.equals(name, that.name) && Objects.equals(modules, that.modules);
72+
}
73+
74+
@Override
75+
public int hashCode() {
76+
return Objects.hash(name, modules);
77+
}
78+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.activemq.artemis.core.config;
18+
19+
import javax.security.auth.login.AppConfigurationEntry;
20+
import java.io.Serializable;
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
import java.util.Objects;
24+
25+
public class JaasAppConfigurationEntry implements Serializable {
26+
27+
private static final long serialVersionUID = -651209063030767725L;
28+
29+
private String name;
30+
31+
private String loginModuleClass;
32+
33+
private String controlFlag;
34+
35+
private Map<String, String> params = new HashMap<>();
36+
37+
public JaasAppConfigurationEntry() {
38+
}
39+
40+
public String getName() {
41+
return name;
42+
}
43+
44+
public String getLoginModuleClass() {
45+
return loginModuleClass;
46+
}
47+
48+
public Map<String, String> getParams() {
49+
return params;
50+
}
51+
52+
public String getControlFlag() {
53+
return controlFlag;
54+
}
55+
56+
public JaasAppConfigurationEntry setName(String name) {
57+
this.name = name;
58+
return this;
59+
}
60+
61+
public JaasAppConfigurationEntry setLoginModuleClass(String loginModuleClass) {
62+
this.loginModuleClass = loginModuleClass;
63+
return this;
64+
}
65+
66+
public JaasAppConfigurationEntry setParams(Map<String, String> params) {
67+
this.params = params;
68+
return this;
69+
}
70+
71+
public void setControlFlag(String controlFlag) {
72+
this.controlFlag = controlFlag;
73+
getLoginModuleControlFlag();
74+
}
75+
76+
AppConfigurationEntry.LoginModuleControlFlag getLoginModuleControlFlag() {
77+
if (this.controlFlag == null || this.controlFlag.isEmpty() || this.controlFlag.equals("required")) {
78+
return AppConfigurationEntry.LoginModuleControlFlag.REQUIRED;
79+
} else if (this.controlFlag.equals("requisite")) {
80+
return AppConfigurationEntry.LoginModuleControlFlag.REQUISITE;
81+
} else if (this.controlFlag.equals("optional")) {
82+
return AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL;
83+
} else if (this.controlFlag.equals("sufficient")) {
84+
return AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT;
85+
}
86+
throw new IllegalArgumentException("Unknown control flag: " + this.controlFlag);
87+
}
88+
89+
@Override
90+
public boolean equals(Object o) {
91+
if (o == null || getClass() != o.getClass()) return false;
92+
JaasAppConfigurationEntry that = (JaasAppConfigurationEntry) o;
93+
return Objects.equals(name, that.name) && Objects.equals(loginModuleClass, that.loginModuleClass) && Objects.equals(controlFlag, that.controlFlag) && Objects.equals(params, that.params);
94+
}
95+
96+
@Override
97+
public int hashCode() {
98+
return Objects.hash(name, loginModuleClass, controlFlag, params);
99+
}
100+
}

artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import java.util.Properties;
5858
import java.util.Set;
5959
import java.util.Stack;
60+
import java.util.concurrent.ConcurrentHashMap;
6061
import java.util.concurrent.CopyOnWriteArrayList;
6162
import java.util.concurrent.TimeUnit;
6263
import java.util.function.Consumer;
@@ -86,6 +87,7 @@
8687
import org.apache.activemq.artemis.core.config.DivertConfiguration;
8788
import org.apache.activemq.artemis.core.config.FederationConfiguration;
8889
import org.apache.activemq.artemis.core.config.HAPolicyConfiguration;
90+
import org.apache.activemq.artemis.core.config.JaasAppConfiguration;
8991
import org.apache.activemq.artemis.core.config.MetricsConfiguration;
9092
import org.apache.activemq.artemis.core.config.StoreConfiguration;
9193
import org.apache.activemq.artemis.core.config.WildcardConfiguration;
@@ -159,9 +161,11 @@
159161
import org.slf4j.Logger;
160162
import org.slf4j.LoggerFactory;
161163

164+
import javax.security.auth.login.AppConfigurationEntry;
165+
162166
import static org.apache.activemq.artemis.utils.PasswordMaskingUtil.isEncMasked;
163167

164-
public class ConfigurationImpl implements Configuration, Serializable {
168+
public class ConfigurationImpl extends javax.security.auth.login.Configuration implements Configuration, Serializable {
165169

166170
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
167171

@@ -478,6 +482,8 @@ public class ConfigurationImpl implements Configuration, Serializable {
478482

479483
private boolean purgePageFolders = ActiveMQDefaultConfiguration.getPurgePageFolders();
480484

485+
private Map<String, JaasAppConfiguration> jaasConfigs = new ConcurrentHashMap<>();
486+
481487
/**
482488
* Parent folder for all data folders.
483489
*/
@@ -671,6 +677,26 @@ public void parsePrefixedProperties(Object target, String name, Properties prope
671677
if (!beanProperties.isEmpty()) {
672678
populateWithProperties(target, name, beanProperties);
673679
}
680+
if (!jaasConfigs.isEmpty()) {
681+
initJaasConfigOverride();
682+
}
683+
}
684+
685+
private javax.security.auth.login.Configuration defaultJaasConfiguration = null;
686+
private void initJaasConfigOverride() {
687+
if (defaultJaasConfiguration == null) {
688+
defaultJaasConfiguration = javax.security.auth.login.Configuration.getConfiguration();
689+
javax.security.auth.login.Configuration.setConfiguration(this);
690+
}
691+
}
692+
693+
@Override
694+
public AppConfigurationEntry[] getAppConfigurationEntry(String realm) {
695+
if (getJaasConfigs().containsKey(realm)) {
696+
return JaasAppConfiguration.asAppConfigurationEntry(getJaasConfigs().get(realm));
697+
} else {
698+
return defaultJaasConfiguration.getAppConfigurationEntry(realm);
699+
}
674700
}
675701

676702
public void populateWithProperties(final Object target, final String propsId, Map<String, Object> beanProperties) throws InvocationTargetException, IllegalAccessException {
@@ -1002,6 +1028,15 @@ public void exportAsProperties(File file) throws Exception {
10021028
}
10031029
}
10041030

1031+
@Override
1032+
public Map<String, JaasAppConfiguration> getJaasConfigs() {
1033+
return jaasConfigs;
1034+
}
1035+
1036+
public void addJaasConfig(JaasAppConfiguration config) {
1037+
jaasConfigs.put(config.getName(), config);
1038+
}
1039+
10051040
private void writeProperties(FileWriter writer) throws Exception {
10061041
final BeanUtilsBean beanUtilsBean = new BeanUtilsBean();
10071042
beanUtilsBean.getPropertyUtils().addBeanIntrospector(new FluentPropertyBeanIntrospectorWithIgnores());

artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/security/jaas/GuestLoginModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ public class GuestLoginModule implements AuditLoginModule {
4141

4242
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
4343

44-
private static final String GUEST_USER = "org.apache.activemq.jaas.guest.user";
45-
private static final String GUEST_ROLE = "org.apache.activemq.jaas.guest.role";
44+
public static final String GUEST_USER = "org.apache.activemq.jaas.guest.user";
45+
public static final String GUEST_ROLE = "org.apache.activemq.jaas.guest.role";
4646

4747
private String userName = "guest";
4848
private String roleName = "guests";

0 commit comments

Comments
 (0)