Skip to content

Commit 77e3301

Browse files
committed
WFLY-18650 - Security roles lost following failover
1 parent 197587a commit 77e3301

File tree

4 files changed

+61
-8
lines changed

4 files changed

+61
-8
lines changed

auth/realm/base/src/main/java/org/wildfly/security/auth/realm/JaasSecurityRealm.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,16 @@ public Principal getRealmIdentityPrincipal() {
168168
return principal;
169169
}
170170

171+
@Override
171172
public Subject getSubject() {
172173
return subject;
173174
}
174175

176+
@Override
177+
public void setSubject(Subject subject) {
178+
this.subject = subject;
179+
}
180+
175181
@Override
176182
public SupportLevel getCredentialAcquireSupport(final Class<? extends Credential> credentialType, final String algorithmName, final AlgorithmParameterSpec parameterSpec) throws RealmUnavailableException {
177183
return JaasSecurityRealm.this.getCredentialAcquireSupport(credentialType, algorithmName, parameterSpec);

auth/server/base/src/main/java/org/wildfly/security/auth/callback/CachedIdentityAuthorizeCallback.java

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,22 @@
1818

1919
package org.wildfly.security.auth.callback;
2020

21+
import static org.wildfly.common.Assert.checkNotNullParam;
22+
23+
import java.security.Principal;
24+
import java.util.Set;
25+
import java.util.function.Function;
26+
27+
import javax.security.auth.Subject;
28+
2129
import org.wildfly.common.Assert;
2230
import org.wildfly.security.auth.principal.NamePrincipal;
31+
import org.wildfly.security.auth.server.RealmIdentity;
2332
import org.wildfly.security.auth.server.SecurityDomain;
2433
import org.wildfly.security.auth.server.SecurityIdentity;
2534
import org.wildfly.security.cache.CachedIdentity;
2635
import org.wildfly.security.cache.IdentityCache;
2736

28-
import java.security.Principal;
29-
import java.util.function.Function;
30-
31-
import static org.wildfly.common.Assert.checkNotNullParam;
32-
3337
/**
3438
* <p>A callback that is capable of perform authorization based on the identities managed by an {@link IdentityCache}.
3539
*
@@ -139,6 +143,25 @@ public CachedIdentityAuthorizeCallback(Principal principal, Function<SecurityDom
139143
this.localCache = localCache;
140144
}
141145

146+
/**
147+
* Set the Roles present on {@link CachedIdentity} into the {@link RealmIdentity#setSubject(Subject)} in order to get authenticate on all HA nodes;
148+
* @param realmIdentity
149+
*/
150+
public void setSubject(RealmIdentity realmIdentity) {
151+
checkNotNullParam("realmIdentity", realmIdentity);
152+
Subject subject = realmIdentity.getSubject();
153+
if (subject == null) {
154+
CachedIdentity cachedIdentity = createDomainCache().get();
155+
if (cachedIdentity != null) {
156+
subject = new Subject();
157+
Set<Principal> principals = subject.getPrincipals();
158+
principals.add(realmIdentity.getRealmIdentityPrincipal());
159+
cachedIdentity.getRoles().forEach(role -> principals.add(new Roles(role)));
160+
realmIdentity.setSubject(subject);
161+
}
162+
}
163+
}
164+
142165
/**
143166
* Indicates if a cached identity was successfully authorized.
144167
*
@@ -229,4 +252,19 @@ public boolean needsInformation() {
229252
private IdentityCache createDomainCache() {
230253
return this.identityCache.apply(securityDomain);
231254
}
255+
256+
private static class Roles implements Principal {
257+
258+
private final String name;
259+
260+
Roles(final String name) {
261+
this.name = name;
262+
}
263+
264+
@Override
265+
public String getName() {
266+
return this.name;
267+
}
268+
}
269+
232270
}

auth/server/base/src/main/java/org/wildfly/security/auth/server/RealmIdentity.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import java.security.spec.AlgorithmParameterSpec;
2525
import java.util.function.Function;
2626

27+
import javax.security.auth.Subject;
28+
2729
import org.wildfly.common.Assert;
2830
import org.wildfly.security.auth.SupportLevel;
2931
import org.wildfly.security.auth.principal.AnonymousPrincipal;
@@ -55,6 +57,12 @@ public interface RealmIdentity {
5557
*/
5658
Principal getRealmIdentityPrincipal();
5759

60+
default Subject getSubject() {
61+
return null;
62+
}
63+
64+
default void setSubject(Subject subject) {}
65+
5866
/**
5967
* @deprecated Transition method; remove before GA.
6068
*/

auth/server/base/src/main/java/org/wildfly/security/auth/server/ServerAuthenticationContext.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@
6161
import org.wildfly.security.auth.callback.EvidenceVerifyCallback;
6262
import org.wildfly.security.auth.callback.ExclusiveNameCallback;
6363
import org.wildfly.security.auth.callback.FastUnsupportedCallbackException;
64-
import org.wildfly.security.auth.callback.PrincipalAuthorizeCallback;
65-
import org.wildfly.security.auth.callback.MechanismInformationCallback;
6664
import org.wildfly.security.auth.callback.IdentityCredentialCallback;
65+
import org.wildfly.security.auth.callback.MechanismInformationCallback;
6766
import org.wildfly.security.auth.callback.PeerPrincipalCallback;
67+
import org.wildfly.security.auth.callback.PrincipalAuthorizeCallback;
6868
import org.wildfly.security.auth.callback.RequestInformationCallback;
6969
import org.wildfly.security.auth.callback.SSLCallback;
7070
import org.wildfly.security.auth.callback.SecurityIdentityCallback;
@@ -74,6 +74,7 @@
7474
import org.wildfly.security.auth.permission.RunAsPrincipalPermission;
7575
import org.wildfly.security.auth.principal.AnonymousPrincipal;
7676
import org.wildfly.security.auth.principal.NamePrincipal;
77+
import org.wildfly.security.auth.server._private.ElytronMessages;
7778
import org.wildfly.security.auth.server.event.RealmFailedAuthenticationEvent;
7879
import org.wildfly.security.auth.server.event.RealmIdentityFailedAuthorizationEvent;
7980
import org.wildfly.security.auth.server.event.RealmIdentitySuccessfulAuthorizationEvent;
@@ -98,7 +99,6 @@
9899
import org.wildfly.security.password.spec.ClearPasswordSpec;
99100
import org.wildfly.security.ssl.SSLConnection;
100101
import org.wildfly.security.x500.X500;
101-
import org.wildfly.security.auth.server._private.ElytronMessages;
102102

103103
/**
104104
* Server-side authentication context. Instances of this class are used to perform all authentication and re-authorization
@@ -1133,6 +1133,7 @@ private void handleOne(final Callback[] callbacks, final int idx) throws IOExcep
11331133
}
11341134
if (principal != null) {
11351135
setAuthenticationPrincipal(principal);
1136+
authorizeCallback.setSubject(stateRef.get().getRealmIdentity());
11361137
if (authorize()) {
11371138
authorizedIdentity = getAuthorizedIdentity();
11381139
}

0 commit comments

Comments
 (0)