Hi there,
It’s now a couple of days I’m trying to use a ThemeSelectorProviderFactory on keycloak 7.0.0
I implemented it like this :
@JBossLog
public class MyThemeSelectorProviderFactory implements ThemeSelectorProviderFactory {
@Override
public ThemeSelectorProvider create(KeycloakSession keycloakSession) {
log.debug("create theme selector");
if(keycloakSession != null && keycloakSession.getContext() != null && keycloakSession.getContext().getRealm()!= null && keycloakSession.getContext().getRealm().getName() !=null && "sandbox".equalsIgnoreCase(keycloakSession.getContext().getRealm().getName())){
log.debug("create :"+keycloakSession.getContext().getRealm().getName());
log.debug("realm :"+keycloakSession.getContext().getRealm().getName());
return new MyThemeSelectorProvider(keycloakSession);
}
return new DefaultThemeSelectorProvider(keycloakSession);
}
@Override
public void init(Config.Scope scope) {
log.debug("Theme selector factory init");
}
@Override
public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
keycloakSessionFactory.create().
log.debug("Theme selector factory postInit");
}
@Override
public void close() {
log.debug("Theme selector factory close");
}
@Override
public String getId() {
return "MyThemeSelector";
}
@JBossLog
public class MyThemeSelectorProvider implements ThemeSelectorProvider {
private final KeycloakSession session;
public MyThemeSelectorProvider(KeycloakSession session) {
this.session = session;
}
@Override
public String getThemeName(Theme.Type type) {
String name = null;
log.debug("type :"+type.name());
switch (type) {
case WELCOME:
name = Config.scope("theme").get("welcomeTheme");
break;
case LOGIN:
ClientModel client = session.getContext().getClient();
String clientName = client.getName();
log.debug("client :"+type.name());
if (client != null) {
if("client-mobile".equalsIgnoreCase(clientName)){
name = "myCustomTheme";
}
}
if (name == null || name.isEmpty()) {
name = session.getContext().getRealm().getLoginTheme();
}
break;
case ACCOUNT:
name = session.getContext().getRealm().getAccountTheme();
break;
case EMAIL:
name = session.getContext().getRealm().getEmailTheme();
break;
case ADMIN:
name = session.getContext().getRealm().getAdminTheme();
break;
}
if (name == null || name.isEmpty()) {
name = Config.scope("theme").get("default", Version.NAME.toLowerCase());
}
return name;
}
@Override
public void close() {
}
}
I can see it initializing :
Nov 27 09:09:14 keycloak.srv1 sh[105375]: [Server:server-two] 09:09:14,874 DEBUG [com.xxx.keycloak.theme.MyThemeSelectorProviderFactory] (MSC service thread 1-2) Theme selector factory init 14h06
Nov 27 09:09:14 keycloak.srv1 sh[105375]: [Server:server-one] 09:09:14,928 DEBUG [com.xxx.keycloak.theme.MyThemeSelectorProviderFactory] (MSC service thread 1-1) Theme selector factory postInit
Nov 27 09:09:15 keycloak.srv1 sh[105375]: [Server:server-one] 09:09:15,110 INFO [org.jboss.as.server] (ServerService Thread Pool -- 50) WFLYSRV0010: Deployed "my-theme-selector-bundle-1.0.0-SNAPSHOT.ear" (runtime-name : "my-theme-selector-bundle-1.0.0-SNAPSHOT.ear")
The issue is that it never get called, I can’t see no logs of log.debug(“create theme selector”); and it keeps using the default theme selector everywhere
Any help/advice is more than welcome
have a good day