diff --git a/integration/as7-eap6/adapter/src/main/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactory.java b/integration/as7-eap6/adapter/src/main/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactory.java
index 3d8930e..1b01b75 100755
--- a/integration/as7-eap6/adapter/src/main/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactory.java
+++ b/integration/as7-eap6/adapter/src/main/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactory.java
@@ -14,6 +14,7 @@ import org.keycloak.adapters.KeycloakAccount;
import org.keycloak.adapters.tomcat.GenericPrincipalFactory;
import javax.security.auth.Subject;
+import java.lang.reflect.Constructor;
import java.security.Principal;
import java.security.acl.Group;
import java.util.ArrayList;
@@ -29,6 +30,8 @@ import java.util.Set;
*/
public class JBossWebPrincipalFactory extends GenericPrincipalFactory {
+ private static Constructor jbossWebPrincipalConstructor = findJBossGenericPrincipalConstructor();
+
@Override
protected GenericPrincipal createPrincipal(Principal userPrincipal, List<String> roles) {
return null;
@@ -84,9 +87,12 @@ public class JBossWebPrincipalFactory extends GenericPrincipalFactory {
sc.getUtil().createSubjectInfo(userPrincipal, account, subject);
List<String> rolesAsStringList = new ArrayList<String>();
rolesAsStringList.addAll(roleSet);
- return new JBossGenericPrincipal(realm, userPrincipal.getName(), null, rolesAsStringList,
- userPrincipal, null, account, null, subject);
+ try {
+ return (GenericPrincipal) jbossWebPrincipalConstructor.newInstance(realm, userPrincipal.getName(), null, rolesAsStringList, userPrincipal, null, account, null, subject);
+ } catch (Throwable t) {
+ throw new RuntimeException("Failed to create JBossGenericPrincipal", t);
+ }
}
/**
@@ -150,4 +156,19 @@ public class JBossWebPrincipalFactory extends GenericPrincipalFactory {
return roleSets;
}
+ static Constructor findJBossGenericPrincipalConstructor() {
+ for (Constructor<?> c : JBossGenericPrincipal.class.getConstructors()) {
+ if (c.getParameterTypes().length == 9 &&
+ c.getParameterTypes()[0].equals(Realm.class) &&
+ c.getParameterTypes()[1].equals(String.class) &&
+ c.getParameterTypes()[3].equals(List.class) &&
+ c.getParameterTypes()[4].equals(Principal.class) &&
+ c.getParameterTypes()[6].equals(Object.class) &&
+ c.getParameterTypes()[8].equals(Subject.class)) {
+ return c;
+ }
+ }
+ return null;
+ }
+
}
diff --git a/integration/as7-eap6/adapter/src/test/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactoryTest.java b/integration/as7-eap6/adapter/src/test/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactoryTest.java
new file mode 100644
index 0000000..f27bca2
--- /dev/null
+++ b/integration/as7-eap6/adapter/src/test/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactoryTest.java
@@ -0,0 +1,29 @@
+package org.keycloak.adapters.jbossweb;
+
+import org.apache.catalina.Realm;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.security.auth.Subject;
+import java.lang.reflect.Constructor;
+import java.security.Principal;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+public class JBossWebPrincipalFactoryTest {
+
+ @Test
+ public void test() {
+ Constructor constructor = JBossWebPrincipalFactory.findJBossGenericPrincipalConstructor();
+ Assert.assertNotNull(constructor);
+ Assert.assertEquals(Realm.class, constructor.getParameterTypes()[0]);
+ Assert.assertEquals(String.class, constructor.getParameterTypes()[1]);
+ Assert.assertEquals(List.class, constructor.getParameterTypes()[3]);
+ Assert.assertEquals(Principal.class, constructor.getParameterTypes()[4]);
+ Assert.assertEquals(Object.class, constructor.getParameterTypes()[6]);
+ Assert.assertEquals(Subject.class, constructor.getParameterTypes()[8]);
+ }
+
+}