Skip to content

Commit 60725e1

Browse files
committed
concord-server: move subject creation out of SecurityUtils#getSubject
1 parent c7d824d commit 60725e1

File tree

9 files changed

+43
-29
lines changed

9 files changed

+43
-29
lines changed

server/impl/src/main/java/com/walmartlabs/concord/server/process/ProcessSecurityContext.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ public byte[] serializePrincipals(PrincipalCollection src) {
8282

8383
public void storeCurrentSubject(ProcessKey processKey) {
8484
Subject s = SecurityUtils.getSubject();
85+
if (s == null) {
86+
throw new IllegalStateException("Subject is not available. This is a bug.");
87+
}
8588
PrincipalCollection src = s.getPrincipals();
8689
storeSubject(processKey, src);
8790
}
@@ -122,7 +125,7 @@ public <T> T runAs(UUID userID, Callable<T> c) throws Exception {
122125
.principals(principals)
123126
.buildSubject();
124127

125-
ThreadContext.bind(subject);
128+
SecurityUtils.bindSubject(subject);
126129

127130
return c.call();
128131
} finally {
@@ -143,7 +146,7 @@ public <T> T runAsCurrentUser(ProcessKey processKey, Callable<T> c) throws Excep
143146
.buildSubject();
144147

145148
try {
146-
ThreadContext.bind(subject);
149+
SecurityUtils.bindSubject(subject);
147150

148151
return c.call();
149152
} finally {

server/impl/src/main/java/com/walmartlabs/concord/server/process/pipelines/processors/PayloadStoreProcessor.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.walmartlabs.concord.server.sdk.ProcessKey;
3131
import com.walmartlabs.concord.server.sdk.metrics.WithTimer;
3232
import com.walmartlabs.concord.server.security.SecurityUtils;
33+
import org.apache.shiro.subject.Subject;
3334

3435
import javax.inject.Inject;
3536
import javax.inject.Named;
@@ -81,9 +82,14 @@ public Payload process(Chain chain, Payload payload) {
8182

8283
String serializedHeaders = serialize(headers);
8384

85+
Subject initiator = SecurityUtils.getSubject();
86+
if (initiator == null) {
87+
throw new IllegalStateException("Subject is not available. This is a bug.");
88+
}
89+
8490
stateManager.tx(tx -> {
8591
stateManager.insertInitial(tx, processKey, "payload.json", serializedHeaders.getBytes());
86-
stateManager.insertInitial(tx, processKey, "initiator", securityContext.serializePrincipals(SecurityUtils.getSubject().getPrincipals()));
92+
stateManager.insertInitial(tx, processKey, "initiator", securityContext.serializePrincipals(initiator.getPrincipals()));
8793
stateManager.importPathInitial(tx, processKey, "attachments/", payload.getHeader(Payload.BASE_DIR), (path, basicFileAttributes) -> payload.getAttachments().containsValue(path));
8894
});
8995

server/impl/src/main/java/com/walmartlabs/concord/server/security/SecurityUtils.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -44,31 +44,37 @@ public final class SecurityUtils {
4444

4545
public static void logout() {
4646
Subject subject = getSubject();
47-
if (subject != null) {
48-
subject.logout();
47+
if (subject == null) {
48+
return;
4949
}
50+
subject.logout();
5051
}
5152

5253
public static boolean hasRole(String role) {
53-
Subject s = getSubject();
54-
return s.hasRole(role);
54+
Subject subject = getSubject();
55+
if (subject == null) {
56+
return false;
57+
}
58+
return subject.hasRole(role);
5559
}
5660

5761
public static boolean isPermitted(String permission) {
58-
Subject s = getSubject();
59-
return s.isPermitted(permission);
62+
Subject subject = getSubject();
63+
if (subject == null) {
64+
return false;
65+
}
66+
return subject.isPermitted(permission);
67+
}
68+
69+
public static void bindSubject(Subject subject) {
70+
ThreadContext.bind(subject);
6071
}
6172

6273
public static Subject getSubject() {
63-
Subject subject = ThreadContext.getSubject();
64-
if (subject == null) {
65-
subject = (new Subject.Builder()).buildSubject();
66-
ThreadContext.bind(subject);
67-
}
68-
return subject;
74+
return ThreadContext.getSubject();
6975
}
7076

71-
public static <T> T getCurrent(Class<T> type) {
77+
public static <T> T getPrincipal(Class<T> type) {
7278
SecurityManager securityManager = ThreadContext.getSecurityManager();
7379
if (securityManager == null) {
7480
return null;
@@ -87,12 +93,12 @@ public static <T> T getCurrent(Class<T> type) {
8793
return principals.oneByType(type);
8894
}
8995

90-
public static <T> T assertCurrent(Class<T> type) {
91-
T p = getCurrent(type);
92-
if (p == null) {
96+
public static <T> T assertPrincipal(Class<T> type) {
97+
T principal = getPrincipal(type);
98+
if (principal == null) {
9399
throw new AuthenticationException("Can't determine the current principal (" + type.getName() + ")");
94100
}
95-
return p;
101+
return principal;
96102
}
97103

98104
public static byte[] serialize(PrincipalCollection data) {

server/impl/src/main/java/com/walmartlabs/concord/server/security/UserPrincipal.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ public class UserPrincipal implements Serializable {
3535
private static final long serialVersionUID = 1L;
3636

3737
public static UserPrincipal getCurrent() {
38-
return SecurityUtils.getCurrent(UserPrincipal.class);
38+
return SecurityUtils.getPrincipal(UserPrincipal.class);
3939
}
4040

4141
public static UserPrincipal assertCurrent() {
42-
return SecurityUtils.assertCurrent(UserPrincipal.class);
42+
return SecurityUtils.assertPrincipal(UserPrincipal.class);
4343
}
4444

4545
private final String realm;

server/impl/src/main/java/com/walmartlabs/concord/server/security/github/GithubKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
public class GithubKey implements AuthenticationToken {
2929

3030
public static GithubKey getCurrent() {
31-
return SecurityUtils.getCurrent(GithubKey.class);
31+
return SecurityUtils.getPrincipal(GithubKey.class);
3232
}
3333

3434
private static final long serialVersionUID = 1L;

server/impl/src/main/java/com/walmartlabs/concord/server/security/ldap/LdapPrincipal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public LdapPrincipal(String username,
6363
}
6464

6565
public static LdapPrincipal getCurrent() {
66-
return SecurityUtils.getCurrent(LdapPrincipal.class);
66+
return SecurityUtils.getPrincipal(LdapPrincipal.class);
6767
}
6868

6969
public String getUsername() {

server/impl/src/main/java/com/walmartlabs/concord/server/security/sessionkey/SessionKeyPrincipal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
public class SessionKeyPrincipal {
2727

2828
public static SessionKeyPrincipal getCurrent() {
29-
return SecurityUtils.getCurrent(SessionKeyPrincipal.class);
29+
return SecurityUtils.getPrincipal(SessionKeyPrincipal.class);
3030
}
3131

3232
private final PartialProcessKey processKey;

server/impl/src/test/java/com/walmartlabs/concord/server/org/secret/PasswordCheckerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
* =====
2121
*/
2222

23+
import com.walmartlabs.concord.server.security.SecurityUtils;
2324
import com.walmartlabs.concord.server.security.UserPrincipal;
2425
import com.walmartlabs.concord.server.user.UserEntry;
2526
import org.apache.shiro.mgt.DefaultSecurityManager;
@@ -53,7 +54,7 @@ public void bindUser() {
5354
ctx.setPrincipals(new SimplePrincipalCollection(p, p.getRealm()));
5455

5556
Subject subject = securityManager.createSubject(ctx);
56-
ThreadContext.bind(subject);
57+
SecurityUtils.bindSubject(subject);
5758
}
5859

5960
@AfterEach

server/plugins/pfed-sso/src/main/java/com/walmartlabs/concord/server/plugins/pfedsso/SsoLogoutFilter.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323

2424
import com.walmartlabs.concord.server.security.SecurityUtils;
25-
import org.apache.shiro.subject.Subject;
2625
import org.slf4j.Logger;
2726
import org.slf4j.LoggerFactory;
2827

@@ -64,8 +63,7 @@ public void doFilter(HttpServletRequest request, HttpServletResponse response, F
6463
}
6564
}
6665
SsoCookies.clear(response);
67-
Subject subject = SecurityUtils.getSubject();
68-
subject.logout();
66+
SecurityUtils.logout();
6967

7068
redirectHelper.sendRedirect(response, "/#/logout/done");
7169
}

0 commit comments

Comments
 (0)