使用Keycloak和SpringBoot实现多租户

5

我正在使用Spring Boot适配器和Keycloak Spring Boot适配器来执行多租户,可以使用IP和域名访问页面。

但是当我运行gradlew脚本时,似乎没有检测到这个bean,没有任何更改发生。即使我包含了一个记录器,日志也没有被打印,所以我认为这个文件根本没有被读取。我是否遗漏了什么?或者有没有任何实现可以用于多租户。谢谢。

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;
        }
    }


}

我的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
1个回答

7
我曾经遇到过类似的情况,你的代码看起来没问题。以下内容可能对你有所帮助:
1) 从keycloak官方文档了解如何实现多租户:http://www.keycloak.org/docs/3.2/securing_apps/topics/oidc/java/multi-tenancy.html。需要配置哪个KeycloackConfigResolver,但不幸的是,在撰写本文时,似乎没有方便的方法在Spring Boot中实现,这在以下链接中有所提及:
2) 为Spring Boot适配器自定义KeycloakConfigResolver:https://issues.jboss.org/browse/KEYCLOAK-4139?_sscc=t 3) 在完成步骤一和步骤二后,可能出现的情况是Spring可能会根据您的Spring配置覆盖您的实现类。试着重写更多的扩展类方法,添加一些日志,然后在运行时检查Spring日志是否发生了变化(你会看到类似于"...Overriding bean definition for bean...with a different definition: replacing...with..."的信息)。
4) 尝试排除相关类,这样您的实现类将不会被覆盖。例如:@SpringBootApplication(exclude = {KeycloakSpringBootConfiguration.class})
希望这有所帮助或提供一些思路。
敬礼, JZ先生。

2
为了方便其他可能到达这里的人:这是一个使用Spring Boot和KeyCloak实现多租户的示例应用程序(不是我制作的):https://github.com/vimalKeshu/movie-app/ - nonzaprej
上面第2点提到的URL包含了Spring Boot的KeycloakConfigResolver示例代码。 https://issues.redhat.com/browse/KEYCLOAK-4139?_sscc=t - Abhishek K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接