1

Ich verwende Spring-Boot-Adapter und Keycloak-Spring-Boot-Adapter, um Multi-Tenancy durchzuführen, wo ich auf die Seite mit einem IP-und Domain-Namen zugreifen kann. Aber wenn ich Gradlew-Skript ausführen, scheint es, dass diese Bean nicht erkannt wurde keine Änderungen passiert ist. selbst nachdem ich einen logger eingebaut habe, wird das log nicht gedruckt, also nehme ich an, dass diese datei überhaupt nicht gelesen wird. Fehle ich etwas? oder gibt es Implementierungen, die ich für Multitenancy verwenden kann. Vielen Dank.Multitenancy mit Keycloak und SpringBoot

KeycloakTomcatContextCustomizer

@Component 
public class KeycloakTomcatContextCustomizer implements TomcatContextCustomizer 
{ 
    private static final Logger logger = LoggerFactory.getLogger(KeycloakTomcatContextCustomizerBean.class); 

    @Override 
    public void customize(Context context) 
    { 
     LoginConfig loginConfig = new LoginConfig(); 
     loginConfig.setAuthMethod("--KEYCLOAK--"); 
     context.setLoginConfig(loginConfig); 
     context.addSecurityRole("myproject"); 

     SecurityConstraint constraint = new SecurityConstraint(); 
     constraint.addAuthRole("myproject"); 

     SecurityCollection collection = new SecurityCollection(); 
     collection.addPattern("/contexts"); 
     constraint.addCollection(collection); 

     context.addConstraint(constraint); 

     context.addParameter("keycloak.config.resolver", HostBasedKeycloakResolver.class.getName()); 
    } 

    public class HostBasedKeycloakResolver extends KeycloakSpringBootConfigResolver 
    { 
     private KeycloakDeployment keycloakDeployment; 

     @Autowired 
     private AdapterConfig adapterConfig; 

     @Override 
     public KeycloakDeployment resolve(OIDCHttpFacade.Request request) { 
     if (keycloakDeployment != null) { 
      return keycloakDeployment; 
     } 

      //get the host part here 

     //build keycloakdeployment 
      keycloakDeployment = KeycloakDeploymentBuilder.build(adapterConfig); 
      adapterConfig.setAuthServerUrl("https://"+host+"/auth"); 
      System.out.println(adapterConfig.getAuthServerUrl()); 
      return keycloakDeployment; 
     } 
    } 

}

Mein application.yml

keycloak: 
    cors: true 
    realm: Boot-Project 
    realmKey: AARjANBgkqhkiYUitdhjnCAQ8AMIIBCgKCAQEArOS/TTjkgjdoiQ7F6m5x206lJ+K9VBpEjkjrignxIdH7pJDWv9UMg2CL1q3Tfkjg/YdjkljgkbsnqrSzjBcIU5HQ2AQLkRm2eCPuLIB23d2VS3hZGqvbyqN42hbk/oRhloS0tS2/frq4fIeU53KQiRPPiBt1IEO7DINoDUXdyOWS7g/rSrMkjjUm9SohXdv8u3aB+mnI8gNwEag17Cj+wqoc1smPj5jb/8Ab3MynQHv4ekgXYFPI5BEQSXXflBLbL2kjqR2xP8y8XTsOz58XLyWBydjN2R37uds9D2TqipU3tdc286b276RhNCwIDAQAB 
    auth-server-url: https://${__AUTH_VM__:localhost}/auth 
    ssl-required: none 
    resource: myproject 
    bearer-only: true 
    public-client: false 
    credentials: 
    secret: ls5f7c3g-d045-444f-8234-6cth6970726y 
    securityConstraints[0]: 
    securityCollections[0]: 
     name: secured context api and app 
     authRoles: 
     - commongui 
     patterns: 
     - /contexts/* 
     - /config.json 

Antwort

0

ich einen ähnlichen Fall mit erlebt habe, was Sie versuchen, Ihren Code zu erreichen, scheint in Ordnung. Im Folgenden können Sie helfen:

1) Offizielle Dokumentation von keycloak, wie Multi-Tenancy umzusetzen: http://www.keycloak.org/docs/3.2/securing_apps/topics/oidc/java/multi-tenancy.html

von dort wird darauf hingewiesen, dass Sie konfigurieren müssen, welche KeycloackConfigResolver aber leider zu verwenden, wie die Zeit des Schreibens dieses Artikels gibt es keine bequeme Möglichkeit, es im Frühjahr Stiefel zu tun, wie ich auf diesem Ticket gefunden:

2) Individuelle KeycloakConfigResolver für Frühjahr Boot-Adapter: https://issues.jboss.org/browse/KEYCLOAK-4139?_sscc=t

3) Afte r # 1 und # 2, was passieren könnte, ist, dass Spring Ihre Implementierungsklasse abhängig davon, wie Ihre Spring-Konfiguration aufgelöst wird, überschreibt. Versuchen Sie, einige weitere Methoden aus der Klasse, die Sie erweitern, zu überschreiben, fügen Sie eine Protokollierung hinzu und überprüfen Sie Spring-Protokolle während der Laufzeit, wenn dies der Fall ist (Sie sehen etwa Folgendes) ... Überschreibende Bean-Definition für Bean ... mit einer anderen Definition: Ersetzen ... durch ... ")

4) Versuchen Sie, die betroffene Klasse auszuschließen, damit Ihre Implementierungsklasse nicht überschrieben wird. Beispiel: @SpringBootApplication (exclude = {KeycloakSpringBootConfiguration.class})

Hoffe, das hilft oder bietet ein paar Ideen.

Grüße, Sir. JZ

+0

ja es funktioniert! Vielen Dank – James

Verwandte Themen