【发布时间】:2020-03-11 09:00:28
【问题描述】:
我的 Keycloak 服务器和我的 Web 应用程序连接到 Keycloak 以登录到应用程序。
如果我在本地运行,它的重定向完美,但如果我将服务器和 Web 应用程序部署在同一服务器中,当 Web 应用程序重定向到 keycloak 时,它会重定向到 localhost 而不是远程 url。
知道如何避免重定向到本地主机吗?
【问题讨论】:
标签: java web redirect server keycloak
我的 Keycloak 服务器和我的 Web 应用程序连接到 Keycloak 以登录到应用程序。
如果我在本地运行,它的重定向完美,但如果我将服务器和 Web 应用程序部署在同一服务器中,当 Web 应用程序重定向到 keycloak 时,它会重定向到 localhost 而不是远程 url。
知道如何避免重定向到本地主机吗?
【问题讨论】:
标签: java web redirect server keycloak
最后我找到了一个更适合我的答案。我创建了一个 KeycloakConfigResolver 类,在其中我根据正在运行的机器的主机加载一个 KeycloakDeployment,就像它完美地重定向到所需的主机一样。
@Configuration
public class PathServerKeycloakConfigResolver implements KeycloakConfigResolver
{
@Override
public KeycloakDeployment resolve(Request request)
{
String hostname = "Unknown";
try
{
InetAddress addr;
addr = InetAddress.getLocalHost();
hostname = addr.getHostName();
return KeycloakDeploymentBuilder.build(getKeycloakJson(hostname));
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
}
private InputStream getKeycloakJson(String hostname) throws IOException
{
InputStream inputStream = new FileInputStream("src/main/resources/keycloak.json");
InputStreamReader isReader = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(isReader);
StringBuffer sb = new StringBuffer();
String str;
while ((str = reader.readLine()) != null)
{
sb.append(str);
}
return new ByteArrayInputStream(sb.toString().replace("{param_keycloak_server}", hostname).getBytes(StandardCharsets.UTF_8));
}
}
keycloak.json 在哪里,
{
"realm": "FocusocKeycloak",
"auth-server-url": "http://{param_keycloak_server}:8080/auth",
"ssl-required": "external",
"resource": "login-app",
"verify-token-audience": true,
"credentials": {
"secret": "XXX"
},
"confidential-port": 0,
"policy-enforcer": {}
}
【讨论】:
对于 Spring Boot Web 应用重定向 URL 在属性中定义为:
keycloak.auth-server-url = http://localhost:8080/auth
如果你有 JSON 配置文件,那么它看起来像:
{
...
"auth-server-url" : "http://localhost:8080/auth"
}
有关更多详细信息,您可以查看Securing Apps 文档
【讨论】:
keycloak.auth-server-url=${KEYCLOAK_REDIRECT_URL}。然后你应该为你的远程服务器定义像KEYCLOAK_REDIRECT_URL=http://remote.server.com/auth这样的环境变量。