Skip to content

Commit fcef1c6

Browse files
InjectSecurity - inject User object in UserInfo in threadContext (#396) (#397)
* Added user_info injection of User object in InjectSecurity Signed-off-by: Petar <petar.dzepina@gmail.com> (cherry picked from commit f7639aa) Co-authored-by: Petar Dzepina <petar.dzepina@gmail.com>
1 parent c08a573 commit fcef1c6

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

src/main/java/org/opensearch/commons/InjectSecurity.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
import static org.opensearch.commons.ConfigConstants.OPENSEARCH_SECURITY_USE_INJECTED_USER_FOR_PLUGINS;
1111

1212
import java.util.List;
13+
import java.util.StringJoiner;
1314

1415
import org.apache.logging.log4j.LogManager;
1516
import org.apache.logging.log4j.Logger;
1617
import org.opensearch.common.Strings;
1718
import org.opensearch.common.settings.Settings;
1819
import org.opensearch.common.util.concurrent.ThreadContext;
20+
import org.opensearch.commons.authuser.User;
1921

2022
/**
2123
* For background jobs usage only. User or Roles injection can be done using transport layer only.
@@ -91,6 +93,7 @@ public InjectSecurity(final String id, final Settings settings, final ThreadCont
9193

9294
/**
9395
* Injects user or roles, based on opendistro_security_use_injected_user_for_plugins setting. By default injects roles.
96+
* Expects threadContext to be stashed
9497
* @param user
9598
* @param roles
9699
*/
@@ -104,7 +107,8 @@ public void inject(final String user, final List<String> roles) {
104107

105108
/**
106109
* Injects user.
107-
* @param user
110+
* Expects threadContext to be stashed
111+
* @param user name
108112
*/
109113
public void injectUser(final String user) {
110114
if (Strings.isNullOrEmpty(user)) {
@@ -115,8 +119,39 @@ public void injectUser(final String user) {
115119
threadContext.putTransient(INJECTED_USER, user);
116120
log.debug("{}, InjectSecurity - inject roles: {}", Thread.currentThread().getName(), id);
117121
} else {
118-
log.error("{}, InjectSecurity- most likely thread context corruption : {}", Thread.currentThread().getName(), id);
122+
log.error("{}, InjectSecurity - most likely thread context corruption : {}", Thread.currentThread().getName(), id);
123+
}
124+
}
125+
126+
/**
127+
* Injects user object into user info.
128+
* Expects threadContext to be stashed.
129+
* @param user
130+
*/
131+
public void injectUserInfo(final User user) {
132+
if (user == null) {
133+
return;
134+
}
135+
String userObjectAsString = threadContext.getTransient(ConfigConstants.OPENSEARCH_SECURITY_USER_INFO_THREAD_CONTEXT);
136+
if (userObjectAsString != null) {
137+
log
138+
.error(
139+
"{}, InjectSecurity - id: [{}] found existing user_info: {}",
140+
Thread.currentThread().getName(),
141+
id,
142+
userObjectAsString
143+
);
144+
return;
145+
}
146+
StringJoiner joiner = new StringJoiner("|");
147+
joiner.add(user.getName());
148+
joiner.add(java.lang.String.join(",", user.getBackendRoles()));
149+
joiner.add(java.lang.String.join(",", user.getRoles()));
150+
String requestedTenant = user.getRequestedTenant();
151+
if (!Strings.isNullOrEmpty(requestedTenant)) {
152+
joiner.add(requestedTenant);
119153
}
154+
threadContext.putTransient(ConfigConstants.OPENSEARCH_SECURITY_USER_INFO_THREAD_CONTEXT, joiner.toString());
120155
}
121156

122157
/**

src/test/java/org/opensearch/commons/InjectSecurityTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@
1212
import static org.junit.jupiter.api.Assertions.assertTrue;
1313
import static org.opensearch.commons.ConfigConstants.INJECTED_USER;
1414
import static org.opensearch.commons.ConfigConstants.OPENSEARCH_SECURITY_INJECTED_ROLES;
15+
import static org.opensearch.commons.ConfigConstants.OPENSEARCH_SECURITY_USER_INFO_THREAD_CONTEXT;
1516
import static org.opensearch.commons.ConfigConstants.OPENSEARCH_SECURITY_USE_INJECTED_USER_FOR_PLUGINS;
1617

1718
import java.util.Arrays;
1819
import java.util.HashMap;
20+
import java.util.List;
1921

2022
import org.junit.jupiter.api.Test;
2123
import org.opensearch.common.settings.Settings;
2224
import org.opensearch.common.util.concurrent.ThreadContext;
25+
import org.opensearch.commons.authuser.User;
2326

2427
public class InjectSecurityTest {
2528

@@ -85,6 +88,42 @@ public void testInjectUser() {
8588
assertNull(threadContext.getTransient(INJECTED_USER));
8689
}
8790

91+
@Test
92+
public void testInjectUserInfo() {
93+
Settings settings = Settings.builder().build();
94+
Settings headerSettings = Settings.builder().put("request.headers.default", "1").build();
95+
ThreadContext threadContext = new ThreadContext(headerSettings);
96+
threadContext.putHeader("name", "opendistro");
97+
threadContext.putTransient("ctx.name", "plugin");
98+
99+
assertEquals("1", threadContext.getHeader("default"));
100+
assertEquals("opendistro", threadContext.getHeader("name"));
101+
assertEquals("plugin", threadContext.getTransient("ctx.name"));
102+
103+
User user = new User(
104+
"Bob",
105+
List.of("backendRole1", "backendRole2"),
106+
List.of("role1", "role2"),
107+
List.of("attr1", "attr2"),
108+
"tenant1"
109+
);
110+
try (InjectSecurity helper = new InjectSecurity("test-name", null, threadContext)) {
111+
helper.injectUserInfo(user);
112+
assertEquals("1", threadContext.getHeader("default"));
113+
assertEquals("opendistro", threadContext.getHeader("name"));
114+
assertEquals("plugin", threadContext.getTransient("ctx.name"));
115+
assertNotNull(threadContext.getTransient(OPENSEARCH_SECURITY_USER_INFO_THREAD_CONTEXT));
116+
assertEquals(
117+
"Bob|backendRole1,backendRole2|role1,role2|tenant1",
118+
threadContext.getTransient(OPENSEARCH_SECURITY_USER_INFO_THREAD_CONTEXT)
119+
);
120+
}
121+
assertEquals("1", threadContext.getHeader("default"));
122+
assertEquals("opendistro", threadContext.getHeader("name"));
123+
assertEquals("plugin", threadContext.getTransient("ctx.name"));
124+
assertNull(threadContext.getTransient(OPENSEARCH_SECURITY_USER_INFO_THREAD_CONTEXT));
125+
}
126+
88127
@Test
89128
public void testInjectProperty() {
90129
Settings settings = Settings.builder().put(OPENSEARCH_SECURITY_USE_INJECTED_USER_FOR_PLUGINS, false).build();

0 commit comments

Comments
 (0)