Skip to content

Commit ce2e424

Browse files
authored
Merge pull request #10334 from gsmet/security-config
Make Elytron Security extensions config overridable at runtime
2 parents ebaae44 + 7b5790c commit ce2e424

File tree

13 files changed

+166
-113
lines changed

13 files changed

+166
-113
lines changed

extensions/elytron-security-jdbc/deployment/src/main/java/io/quarkus/elytron/security/jdbc/deployment/ElytronSecurityJdbcProcessor.java

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,12 @@
1717
import io.quarkus.elytron.security.deployment.ElytronPasswordMarkerBuildItem;
1818
import io.quarkus.elytron.security.deployment.SecurityRealmBuildItem;
1919
import io.quarkus.elytron.security.jdbc.JdbcRecorder;
20-
import io.quarkus.elytron.security.jdbc.JdbcSecurityRealmConfig;
20+
import io.quarkus.elytron.security.jdbc.JdbcSecurityRealmBuildTimeConfig;
21+
import io.quarkus.elytron.security.jdbc.JdbcSecurityRealmRuntimeConfig;
2122
import io.quarkus.runtime.RuntimeValue;
2223

2324
class ElytronSecurityJdbcProcessor {
2425

25-
JdbcSecurityRealmConfig jdbc;
26-
2726
@BuildStep
2827
CapabilityBuildItem capability() {
2928
return new CapabilityBuildItem(Capability.SECURITY_ELYTRON_JDBC);
@@ -36,34 +35,32 @@ FeatureBuildItem feature() {
3635

3736
/**
3837
* Check to see if a JdbcRealmConfig was specified and enabled and create a
39-
* {@linkplain org.wildfly.security.auth.realm.JdbcSecurityRealmConfig}
38+
* {@linkplain org.wildfly.security.auth.realm.JdbcSecurityRealmBuildTimeConfig}
4039
* runtime value to process the user/roles properties files. This also registers the names of the user/roles properties
41-
* files
42-
* to include the build artifact.
43-
*
44-
* @param recorder - runtime security recorder
45-
* @param securityRealm - the producer factory for the SecurityRealmBuildItem
46-
* @param dataSourcesConfigured - ensure that the Agroal datasources are configured first
47-
* @throws Exception - on any failure
40+
* files to include the build artifact.
4841
*/
4942
@BuildStep
5043
@Record(ExecutionTime.RUNTIME_INIT)
5144
void configureJdbcRealmAuthConfig(JdbcRecorder recorder,
45+
JdbcSecurityRealmBuildTimeConfig jdbcSecurityRealmBuildTimeConfig,
46+
JdbcSecurityRealmRuntimeConfig jdbcSecurityRealmRuntimeConfig,
5247
BuildProducer<SecurityRealmBuildItem> securityRealm,
5348
BeanContainerBuildItem beanContainerBuildItem, //we need this to make sure ArC is initialized
5449
List<JdbcDataSourceBuildItem> dataSourcesConfigured) throws Exception {
55-
if (jdbc.enabled) {
56-
RuntimeValue<SecurityRealm> realm = recorder.createRealm(jdbc);
57-
securityRealm.produce(new SecurityRealmBuildItem(realm, jdbc.realmName, null));
50+
if (!jdbcSecurityRealmBuildTimeConfig.enabled) {
51+
return;
5852
}
53+
54+
RuntimeValue<SecurityRealm> realm = recorder.createRealm(jdbcSecurityRealmRuntimeConfig);
55+
securityRealm.produce(new SecurityRealmBuildItem(realm, jdbcSecurityRealmBuildTimeConfig.realmName, null));
5956
}
6057

6158
@BuildStep
62-
ElytronPasswordMarkerBuildItem marker() {
63-
if (jdbc.enabled) {
64-
return new ElytronPasswordMarkerBuildItem();
59+
ElytronPasswordMarkerBuildItem marker(JdbcSecurityRealmBuildTimeConfig jdbcSecurityRealmBuildTimeConfig) {
60+
if (!jdbcSecurityRealmBuildTimeConfig.enabled) {
61+
return null;
6562
}
66-
return null;
63+
return new ElytronPasswordMarkerBuildItem();
6764
}
6865

6966
}

extensions/elytron-security-jdbc/runtime/src/main/java/io/quarkus/elytron/security/jdbc/JdbcRecorder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class JdbcRecorder {
2727
* @param config - the realm config
2828
* @return - runtime value wrapper for the SecurityRealm
2929
*/
30-
public RuntimeValue<SecurityRealm> createRealm(JdbcSecurityRealmConfig config) {
30+
public RuntimeValue<SecurityRealm> createRealm(JdbcSecurityRealmRuntimeConfig config) {
3131
Supplier<Provider[]> providers = new Supplier<Provider[]>() {
3232
@Override
3333
public Provider[] get() {
Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* {@linkplain org.wildfly.security.auth.realm.jdbc.JdbcSecurityRealm}
1010
*/
1111
@ConfigRoot(name = "security.jdbc", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
12-
public class JdbcSecurityRealmConfig {
12+
public class JdbcSecurityRealmBuildTimeConfig {
1313

1414
/**
1515
* The realm name
@@ -23,19 +23,11 @@ public class JdbcSecurityRealmConfig {
2323
@ConfigItem
2424
public boolean enabled;
2525

26-
/**
27-
* The principal-queries config
28-
*/
29-
@ConfigItem(name = "principal-query")
30-
public PrincipalQueriesConfig principalQueries;
31-
// https://github.com/wildfly/wildfly-core/blob/master/elytron/src/test/resources/org/wildfly/extension/elytron/security-realms.xml#L18
32-
3326
@Override
3427
public String toString() {
3528
return "JdbcRealmConfig{" +
3629
", realmName='" + realmName + '\'' +
3730
", enabled=" + enabled +
38-
", principalQueries=" + principalQueries +
3931
'}';
4032
}
4133
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.quarkus.elytron.security.jdbc;
2+
3+
import io.quarkus.runtime.annotations.ConfigItem;
4+
import io.quarkus.runtime.annotations.ConfigPhase;
5+
import io.quarkus.runtime.annotations.ConfigRoot;
6+
7+
/**
8+
* A configuration object for a jdbc based realm configuration,
9+
* {@linkplain org.wildfly.security.auth.realm.jdbc.JdbcSecurityRealm}
10+
*/
11+
@ConfigRoot(name = "security.jdbc", phase = ConfigPhase.RUN_TIME)
12+
public class JdbcSecurityRealmRuntimeConfig {
13+
14+
/**
15+
* The principal-queries config
16+
*/
17+
@ConfigItem(name = "principal-query")
18+
public PrincipalQueriesConfig principalQueries;
19+
// https://github.com/wildfly/wildfly-core/blob/master/elytron/src/test/resources/org/wildfly/extension/elytron/security-realms.xml#L18
20+
21+
@Override
22+
public String toString() {
23+
return "JdbcRealmConfig{" +
24+
"principalQueries=" + principalQueries +
25+
'}';
26+
}
27+
}

extensions/elytron-security-ldap/deployment/src/main/java/io/quarkus/elytron/security/ldap/deployment/ElytronSecurityLdapProcessor.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616
import io.quarkus.elytron.security.deployment.SecurityRealmBuildItem;
1717
import io.quarkus.elytron.security.ldap.LdapRecorder;
1818
import io.quarkus.elytron.security.ldap.QuarkusDirContextFactory;
19-
import io.quarkus.elytron.security.ldap.config.LdapSecurityRealmConfig;
19+
import io.quarkus.elytron.security.ldap.config.LdapSecurityRealmBuildTimeConfig;
20+
import io.quarkus.elytron.security.ldap.config.LdapSecurityRealmRuntimeConfig;
2021
import io.quarkus.runtime.RuntimeValue;
2122

2223
class ElytronSecurityLdapProcessor {
2324

24-
LdapSecurityRealmConfig ldap;
25-
2625
@BuildStep
2726
CapabilityBuildItem capability() {
2827
return new CapabilityBuildItem(Capability.SECURITY_ELYTRON_LDAP);
@@ -36,29 +35,29 @@ FeatureBuildItem feature() {
3635
/**
3736
* Check to see if a LdapRealmConfig was specified and enabled and create a
3837
* {@linkplain org.wildfly.security.auth.realm.ldap.LdapSecurityRealm}
39-
*
40-
* @param recorder - runtime security recorder
41-
* @param securityRealm - the producer factory for the SecurityRealmBuildItem
42-
* @throws Exception - on any failure
4338
*/
4439
@BuildStep
4540
@Record(ExecutionTime.RUNTIME_INIT)
4641
void configureLdapRealmAuthConfig(LdapRecorder recorder,
42+
LdapSecurityRealmBuildTimeConfig ldapSecurityRealmBuildTimeConfig,
43+
LdapSecurityRealmRuntimeConfig ldapSecurityRealmRuntimeConfig,
4744
BuildProducer<SecurityRealmBuildItem> securityRealm,
4845
BeanContainerBuildItem beanContainerBuildItem //we need this to make sure ArC is initialized
4946
) throws Exception {
50-
if (ldap.enabled) {
51-
RuntimeValue<SecurityRealm> realm = recorder.createRealm(ldap);
52-
securityRealm.produce(new SecurityRealmBuildItem(realm, ldap.realmName, null));
47+
if (!ldapSecurityRealmBuildTimeConfig.enabled) {
48+
return;
5349
}
50+
51+
RuntimeValue<SecurityRealm> realm = recorder.createRealm(ldapSecurityRealmRuntimeConfig);
52+
securityRealm.produce(new SecurityRealmBuildItem(realm, ldapSecurityRealmBuildTimeConfig.realmName, null));
5453
}
5554

5655
@BuildStep
57-
ElytronPasswordMarkerBuildItem marker() {
58-
if (ldap.enabled) {
59-
return new ElytronPasswordMarkerBuildItem();
56+
ElytronPasswordMarkerBuildItem marker(LdapSecurityRealmBuildTimeConfig ldapSecurityRealmBuildTimeConfig) {
57+
if (!ldapSecurityRealmBuildTimeConfig.enabled) {
58+
return null;
6059
}
61-
return null;
60+
return new ElytronPasswordMarkerBuildItem();
6261
}
6362

6463
@BuildStep

extensions/elytron-security-ldap/runtime/src/main/java/io/quarkus/elytron/security/ldap/LdapRecorder.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import io.quarkus.elytron.security.ldap.config.AttributeMappingConfig;
1616
import io.quarkus.elytron.security.ldap.config.DirContextConfig;
1717
import io.quarkus.elytron.security.ldap.config.IdentityMappingConfig;
18-
import io.quarkus.elytron.security.ldap.config.LdapSecurityRealmConfig;
18+
import io.quarkus.elytron.security.ldap.config.LdapSecurityRealmRuntimeConfig;
1919
import io.quarkus.runtime.RuntimeValue;
2020
import io.quarkus.runtime.annotations.Recorder;
2121

@@ -25,19 +25,19 @@ public class LdapRecorder {
2525
/**
2626
* Create a runtime value for a {@linkplain LdapSecurityRealm}
2727
*
28-
* @param config - the realm config
29-
* @return - runtime value wrapper for the SecurityRealm
28+
* @param runtimeConfig the realm config
29+
* @return runtime value wrapper for the SecurityRealm
3030
*/
31-
public RuntimeValue<SecurityRealm> createRealm(LdapSecurityRealmConfig config) {
31+
public RuntimeValue<SecurityRealm> createRealm(LdapSecurityRealmRuntimeConfig runtimeConfig) {
3232
LdapSecurityRealmBuilder builder = LdapSecurityRealmBuilder.builder()
33-
.setDirContextSupplier(createDirContextSupplier(config.dirContext))
33+
.setDirContextSupplier(createDirContextSupplier(runtimeConfig.dirContext))
3434
.identityMapping()
35-
.map(createAttributeMappings(config.identityMapping))
36-
.setRdnIdentifier(config.identityMapping.rdnIdentifier)
37-
.setSearchDn(config.identityMapping.searchBaseDn)
35+
.map(createAttributeMappings(runtimeConfig.identityMapping))
36+
.setRdnIdentifier(runtimeConfig.identityMapping.rdnIdentifier)
37+
.setSearchDn(runtimeConfig.identityMapping.searchBaseDn)
3838
.build();
3939

40-
if (config.directVerification) {
40+
if (runtimeConfig.directVerification) {
4141
builder.addDirectEvidenceVerification(false);
4242
}
4343

@@ -47,8 +47,8 @@ public RuntimeValue<SecurityRealm> createRealm(LdapSecurityRealmConfig config) {
4747
private ExceptionSupplier<DirContext, NamingException> createDirContextSupplier(DirContextConfig dirContext) {
4848
DirContextFactory dirContextFactory = new QuarkusDirContextFactory(
4949
dirContext.url,
50-
dirContext.principal,
51-
dirContext.password);
50+
dirContext.principal.orElse(null),
51+
dirContext.password.orElse(null));
5252
return () -> dirContextFactory.obtainDirContext(DirContextFactory.ReferralMode.IGNORE);
5353
}
5454

extensions/elytron-security-ldap/runtime/src/main/java/io/quarkus/elytron/security/ldap/config/DirContextConfig.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.quarkus.elytron.security.ldap.config;
22

3+
import java.util.Optional;
4+
35
import io.quarkus.runtime.annotations.ConfigGroup;
46
import io.quarkus.runtime.annotations.ConfigItem;
57

@@ -16,13 +18,13 @@ public class DirContextConfig {
1618
* The principal: user which is used to connect to ldap server (also named "bindDn")
1719
*/
1820
@ConfigItem
19-
public String principal;
21+
public Optional<String> principal;
2022

2123
/**
2224
* The password which belongs to the principal (also named "bindCredential")
2325
*/
2426
@ConfigItem
25-
public String password;
27+
public Optional<String> password;
2628

2729
@Override
2830
public String toString() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.quarkus.elytron.security.ldap.config;
2+
3+
import io.quarkus.runtime.annotations.ConfigItem;
4+
import io.quarkus.runtime.annotations.ConfigPhase;
5+
import io.quarkus.runtime.annotations.ConfigRoot;
6+
7+
/**
8+
* A configuration object for a LDAP based realm configuration,
9+
* {@linkplain org.wildfly.security.auth.realm.ldap.LdapSecurityRealm}
10+
*/
11+
@ConfigRoot(name = "security.ldap", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
12+
public class LdapSecurityRealmBuildTimeConfig {
13+
14+
/**
15+
* The option to enable the ldap elytron module
16+
*/
17+
@ConfigItem
18+
public boolean enabled;
19+
20+
/**
21+
* The elytron realm name
22+
*/
23+
@ConfigItem(defaultValue = "Quarkus")
24+
public String realmName;
25+
26+
@Override
27+
public String toString() {
28+
return "LdapSecurityRealmBuildTimeConfig{" +
29+
"enabled=" + enabled +
30+
", realmName='" + realmName + '\'' +
31+
'}';
32+
}
33+
}
Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,11 @@
55
import io.quarkus.runtime.annotations.ConfigRoot;
66

77
/**
8-
* A configuration object for a jdbc based realm configuration,
8+
* Runtime configuration object for a LDAP based realm configuration,
99
* {@linkplain org.wildfly.security.auth.realm.ldap.LdapSecurityRealm}
1010
*/
11-
@ConfigRoot(name = "security.ldap", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
12-
public class LdapSecurityRealmConfig {
13-
14-
/**
15-
* The option to enable the ldap elytron module
16-
*/
17-
@ConfigItem
18-
public boolean enabled;
19-
20-
/**
21-
* The elytron realm name
22-
*/
23-
@ConfigItem(defaultValue = "Quarkus")
24-
public String realmName;
11+
@ConfigRoot(name = "security.ldap", phase = ConfigPhase.RUN_TIME)
12+
public class LdapSecurityRealmRuntimeConfig {
2513

2614
/**
2715
* Provided credentials are verified against ldap?
@@ -43,10 +31,8 @@ public class LdapSecurityRealmConfig {
4331

4432
@Override
4533
public String toString() {
46-
return "LdapSecurityRealmConfig{" +
47-
"enabled=" + enabled +
48-
", realmName='" + realmName + '\'' +
49-
", directVerification=" + directVerification +
34+
return "LdapSecurityRealmRuntimeConfig{" +
35+
"directVerification=" + directVerification +
5036
", dirContext=" + dirContext +
5137
", identityMapping=" + identityMapping +
5238
'}';

extensions/elytron-security-oauth2/deployment/src/main/java/io/quarkus/elytron/security/oauth2/deployment/OAuth2DeploymentProcessor.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
import io.quarkus.deployment.builditem.FeatureBuildItem;
1818
import io.quarkus.elytron.security.deployment.ElytronTokenMarkerBuildItem;
1919
import io.quarkus.elytron.security.deployment.SecurityRealmBuildItem;
20-
import io.quarkus.elytron.security.oauth2.runtime.OAuth2Config;
20+
import io.quarkus.elytron.security.oauth2.runtime.OAuth2BuildTimeConfig;
2121
import io.quarkus.elytron.security.oauth2.runtime.OAuth2Recorder;
22+
import io.quarkus.elytron.security.oauth2.runtime.OAuth2RuntimeConfig;
2223
import io.quarkus.elytron.security.oauth2.runtime.auth.OAuth2AuthMechanism;
2324
import io.quarkus.runtime.RuntimeValue;
2425
import io.quarkus.security.identity.SecurityIdentityAugmentor;
@@ -32,8 +33,6 @@
3233
class OAuth2DeploymentProcessor {
3334
private static final String REALM_NAME = "OAuth2";
3435

35-
OAuth2Config oauth2;
36-
3736
@BuildStep
3837
CapabilityBuildItem capability() {
3938
return new CapabilityBuildItem(Capability.SECURITY_ELYTRON_OAUTH2);
@@ -61,29 +60,33 @@ ExtensionSslNativeSupportBuildItem activateSslNativeSupport() {
6160
@BuildStep
6261
@Record(ExecutionTime.RUNTIME_INIT)
6362
AdditionalBeanBuildItem configureOauth2RealmAuthConfig(OAuth2Recorder recorder,
63+
OAuth2BuildTimeConfig oauth2BuildTimeConfig,
64+
OAuth2RuntimeConfig oauth2RuntimeConfig,
6465
BuildProducer<SecurityRealmBuildItem> securityRealm) throws Exception {
65-
if (oauth2.enabled) {
66-
RuntimeValue<SecurityRealm> realm = recorder.createRealm(oauth2);
67-
securityRealm.produce(new SecurityRealmBuildItem(realm, REALM_NAME, null));
68-
return AdditionalBeanBuildItem.unremovableOf(OAuth2AuthMechanism.class);
66+
if (!oauth2BuildTimeConfig.enabled) {
67+
return null;
6968
}
70-
return null;
69+
70+
RuntimeValue<SecurityRealm> realm = recorder.createRealm(oauth2RuntimeConfig);
71+
securityRealm.produce(new SecurityRealmBuildItem(realm, REALM_NAME, null));
72+
return AdditionalBeanBuildItem.unremovableOf(OAuth2AuthMechanism.class);
7173
}
7274

7375
@BuildStep
74-
ElytronTokenMarkerBuildItem marker() {
75-
if (oauth2.enabled) {
76-
return new ElytronTokenMarkerBuildItem();
76+
ElytronTokenMarkerBuildItem marker(OAuth2BuildTimeConfig oauth2BuildTimeConfig) {
77+
if (!oauth2BuildTimeConfig.enabled) {
78+
return null;
7779
}
78-
return null;
80+
return new ElytronTokenMarkerBuildItem();
7981
}
8082

8183
@BuildStep
8284
@Record(ExecutionTime.STATIC_INIT)
83-
SyntheticBeanBuildItem augmentor(OAuth2Recorder recorder) {
85+
SyntheticBeanBuildItem augmentor(OAuth2Recorder recorder,
86+
OAuth2BuildTimeConfig oauth2BuildTimeConfig) {
8487
return SyntheticBeanBuildItem.configure(SecurityIdentityAugmentor.class)
8588
.scope(ApplicationScoped.class)
86-
.runtimeValue(recorder.augmentor(oauth2))
89+
.runtimeValue(recorder.augmentor(oauth2BuildTimeConfig))
8790
.unremovable()
8891
.done();
8992
}

0 commit comments

Comments
 (0)