使用 Keycloak 和 SpringBoot 的多租户
Multitenancy using Keycloak and SpringBoot
我正在使用 spring 启动适配器和 keycloak spring 启动适配器来执行多租户,我可以使用 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) keycloak关于如何实现多租户的官方文档:
http://www.keycloak.org/docs/3.2/securing_apps/topics/oidc/java/multi-tenancy.html
从那里,有人指出您需要配置要使用的 KeycloackConfigResolver,但不幸的是,截至撰写本文时,我在 Spring Boot 中没有找到方便的方法来完成此操作这张票:
2) Spring 启动适配器的自定义 KeycloakConfigResolver:
https://issues.jboss.org/browse/KEYCLOAK-4139?_sscc=t
3) 在#1 和#2 之后,可能发生的情况是 Spring 可能会覆盖您的实现 class,具体取决于您的 Spring 配置的解析方式。尝试覆盖您正在扩展的 class 中的更多方法,添加一些日志记录,然后在 运行 时间内检查 Spring 日志,如果发生这种情况(您会看到类似的内容“...覆盖 bean 的 bean 定义...使用不同的定义:用...替换...”)
4) 尝试排除相关 class 以便您的实现 class 不会被覆盖 例如:
@SpringBootApplication(排除={KeycloakSpringBootConfiguration.class})
希望这有助于或提供一些想法。
此致,
先生。杰兹
我正在使用 spring 启动适配器和 keycloak spring 启动适配器来执行多租户,我可以使用 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) keycloak关于如何实现多租户的官方文档: http://www.keycloak.org/docs/3.2/securing_apps/topics/oidc/java/multi-tenancy.html
从那里,有人指出您需要配置要使用的 KeycloackConfigResolver,但不幸的是,截至撰写本文时,我在 Spring Boot 中没有找到方便的方法来完成此操作这张票:
2) Spring 启动适配器的自定义 KeycloakConfigResolver: https://issues.jboss.org/browse/KEYCLOAK-4139?_sscc=t
3) 在#1 和#2 之后,可能发生的情况是 Spring 可能会覆盖您的实现 class,具体取决于您的 Spring 配置的解析方式。尝试覆盖您正在扩展的 class 中的更多方法,添加一些日志记录,然后在 运行 时间内检查 Spring 日志,如果发生这种情况(您会看到类似的内容“...覆盖 bean 的 bean 定义...使用不同的定义:用...替换...”)
4) 尝试排除相关 class 以便您的实现 class 不会被覆盖 例如: @SpringBootApplication(排除={KeycloakSpringBootConfiguration.class})
希望这有助于或提供一些想法。
此致, 先生。杰兹