- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 docker 容器中运行 Spring Boot 和 Keycloak 时遇到问题。
我开始使用 Keycloak,mysql 作为 db 在 docker 中运行。
services:
mysql:
image: mysql:5.7
container_name: mysql
volumes:
- mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: keycloak
MYSQL_USER: keycloak
MYSQL_PASSWORD: password
networks:
- testNetwork
keycloak:
image: jboss/keycloak
container_name: keycloak
restart: on-failure
volumes:
- ./config:/config/
environment:
DB_VENDOR: MYSQL
DB_ADDR: mysql
DB_DATABASE: keycloak
DB_USER: keycloak
DB_PASSWORD: password
KEYCLOAK_USER: xxx
KEYCLOAK_PASSWORD: yyy
KEYCLOAK_IMPORT_REALM: /keycloak/import/realm-import.json
ports:
- 8180:8080
depends_on:
- mysql
networks:
- testNetwork
然后我添加了我的领域 (SpringBootKeycloak)、我的客户端 (testclient) 和一个角色为“user”的用户。之后,我将 spring-security 添加到我的 Spring-boot-application 中。并编辑了我的 application.yml
spring:
main:
banner-mode: 'off'
application:
name: testclient
version: @project.version@
jpa:
hibernate:
ddl-auto: create
datasource:
url: jdbc:h2:mem:testclient;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: xxx
password: xxx
keycloak:
auth-server-url: http://localhost:8180/auth
realm: SpringBootKeycloak
resource: testclient
public-client: true
principal-attribute: preferred_username
security-constraints:
- authRoles:
- user
securityCollections:
- patterns:
- /*
server:
port: ${port:8090}
rest:
path: testclient
据此我添加了我的 SecurityConfig:
/**
* Secure appropriate endpoints
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests()
.antMatchers("/*").hasRole("user") // only user with role user are allowed to access
.anyRequest().permitAll();
}
在本地运行我的 SpringBoot 应用程序工作正常。我必须使用 keycloak 登录并重定向到 localhost:8090。但是当我将我的 SpringBoot-Application 添加到我的 docker-compose 并在容器中启动它时,我仍然使用 keycloak 进行登录,但是当我应该重定向时,我得到了 403。
testclient:
image: testclient
container_name: testclient
environment:
JAVA_OPTS: "-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n"
build:
context: testclient-application
ports:
- 8090:8090
- 5006:5005
networks:
- testNetwork
具有以下容器日志:
{"@timestamp":"2018-08-16T11:50:11.530+00:00","@version":"1","message":"failed to turn code into token","logger_name":"org.keycloak.adapters.OAuthRequestAuthenticator","thread_name":"http-nio-8090-exec-6","level":"ERROR","level_value":40000,"stack_trace":"java.net.ConnectException: Connection refused (Connection refused)\n\tat java.net.PlainSocketImpl.socketConnect(Native Method)\n\tat java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)\n\tat java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)\n\tat java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)\n\tat java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)\n\tat java.net.Socket.connect(Socket.java:589)\n\tat org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)\n\tat org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)\n\tat org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:144)\n\tat org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:134)\n\tat org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610)\n\tat org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)\n\tat org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)\n\tat org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)\n\tat org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)\n\tat org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)\n\tat org.keycloak.adapters.ServerRequest.invokeAccessCodeToToken(ServerRequest.java:111)\n\tat org.keycloak.adapters.OAuthRequestAuthenticator.resolveCode(OAuthRequestAuthenticator.java:336)\n\tat org.keycloak.adapters.OAuthRequestAuthenticator.authenticate(OAuthRequestAuthenticator.java:281)\n\tat org.keycloak.adapters.RequestAuthenticator.authenticate(RequestAuthenticator.java:139)\n\tat org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.authenticateInternal(AbstractKeycloakAuthenticatorValve.java:203)\n\tat org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve.authenticate(KeycloakAuthenticatorValve.java:50)\n\tat org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve.doAuthenticate(KeycloakAuthenticatorValve.java:57)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:575)\n\tat org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.invoke(AbstractKeycloakAuthenticatorValve.java:181)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.lang.Thread.run(Thread.java:748)\n","app":"testclient","version":"1.0.0-SNAPSHOT"}
我想不出如何解决这个...
编辑 1:更多信息:我在 Windows 上运行 docker。
编辑 2:解决方案
我的工作解决方案包含以下内容:
To make things work, you’ll need to make sure to add the following to your hosts file (/etc/hosts on Mac/Linux, c:\Windows\System32\Drivers\etc\hosts on Windows).
127.0.0.1 keycloak
This is because you will access your application with a browser on your machine (which name is localhost, or 127.0.0.1), but inside Docker it will run in its own container, which name is keycloak.
内部 Docker 端口和发布的端口需要相同:
services:
mysql:
image: mysql:5.7
container_name: mysql
volumes:
- mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: keycloak
MYSQL_USER: keycloak
MYSQL_PASSWORD: password
networks:
- testNetwork
keycloak:
image: jboss/keycloak
container_name: keycloak
restart: on-failure
volumes:
- ./config:/config/
environment:
DB_VENDOR: MYSQL
DB_ADDR: mysql
DB_DATABASE: keycloak
DB_USER: keycloak
DB_PASSWORD: password
KEYCLOAK_USER: xxx
KEYCLOAK_PASSWORD: yyy
KEYCLOAK_IMPORT_REALM: /keycloak/import/realm-import.json
ports:
- 8080:8080 <--- edited
depends_on:
- mysql
networks:
- testNetwork
第 3 步:在 application.yml 中为 Spring boot 编辑的 auth-server-url 中的 keycloak 定义:
keycloak:
realm: SpringBootKeycloak
auth-server-url: http://keycloak:8080/auth <--- edited
resource: testclient
public-client: true
security-constraints:
- authRoles:
- user
securityCollections:
- patterns:
- /*
ssl-required: external
confidential-port: 0
这个解决方案带来的丑陋之处:您无法将 Docker 端口映射到另一个端口以从 url 访问。 端口: - 8080:8080我花了很多时间测试其他组合,结果是访问 url 端口必须与内部 docker 端口(在我的例子中是 8080)相同。
编辑 4:
同样的事情也适用于 Thorntail。
要更改 Keycloak 添加的端口...
environment:
JAVA_OPTS: "-Djboss.socket.binding.port-offset=10 -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m
-Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true"
... 用于 docker-compose 中的 keycloak。-Djboss.socket.binding.port-offset=10 设置默认端口(8080)+偏移量(10)其余的是 keycloak 的默认值。不要忘记编辑“ports”和“auth-server-url”
最佳答案
我认为您的问题是 auth-server-url: http://localhost:8180/auth
。当您的应用程序在 docker 容器内运行时,localhost
实际上具有不同的含义。
在容器内部,它需要是容器的名称,即 keycloak
。这有点尴尬,因为当您从主机连接到 keycloak 时,您想要使用 localhost
但 token 发行者 url 需要与请求 token 的 url 匹配(否则 token 被拒绝)所以你最终不得不将 keycloak
放入你的 etc/hosts 文件中。
你在这个问题上很好 - 我遇到过这个 working with Activiti .你可以找到 JHipster project dealing with it in the same way - 他们说:
To make things work, you’ll need to make sure to add the following to your hosts file (
/etc/hosts
on Mac/Linux,c:\Windows\System32\Drivers\etc\hosts
on Windows).
127.0.0.1 keycloak
This is because you will access your application with a browser on your machine (which name is
localhost
, or127.0.0.1
), but inside Docker it will run in its own container, which name iskeycloak
.
关于java - Docker(Spring Boot 或 Thorntail)和 Keycloak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51877246/
我还在学习,这是我第一次写后端。有一个限制,我必须使用Thorntail。我对此了解不多。 Thorntail Project Generator有一个可用依赖项的列表,但我看到的教程使用 Maven
我的 Maven 项目遇到问题。我正在尝试使用命令“mvn clean install”,但没有成功。我已经在 Eclipse IDE 中更新并清理了 Maven 项目。我还删除了“.m2”目录中的文
我正在 Thorntail 中编写一个计划任务,该任务将运行很长时间(大约 30 分钟)。然而,Thorntail 似乎将执行时间限制为 30 秒。 我的代码如下所示(我删除了我认为不相关的代码):
我使用 Thorntail Project Generator 创建了一个新项目。我想提供少量静态文件,例如 html、图像等 我该怎么做? 最佳答案 假设您使用 Maven 构建项目,您需要: 确保
我需要将 Wildfly-Thorntail 从 2.2 升级到 2.3,以解决与 Maven 3.6 的兼容性问题。在 Maven 3.5 和 2.2 下,该项目可以完美构建和运行,但在 3.6 下
尝试打包 thorntail-examples project 时在 github 上,构建在几个示例中失败,指出与此类似的 API 不兼容错误... [ERROR] Failed to execut
您能否提供Quarkus之间更详细的区别?和 Thorntail ? 这有助于在构建新的“Java 云原生应用”时在这两者之间进行考虑。 最佳答案 Quarkus 对 Thorntail 的看法: 能
我刚刚开始使用 Thorntail,并尝试做最简单的测试。我编写了一个仅返回成功状态的 HealthCheck 实现。就这样。然而,当我运行 mvn thorntail:run 时,我收到一条错误消息
这个问题是关于以可移植的方式读取 REST 服务中的配置的正确方法,例如应在 Thorntail 2.4.0 和 Wildfly 15 上运行。 这是 Thorntail 建议的原始实现 @Injec
我正在启动一个 Thorntail 空心 jar 并传入 --properties=environment.properties。该文件包含一个带有 ${...} 表达式的属性,该表达式并不供 Tho
我的 JavaEE 应用程序有问题,我尝试创建将自动部署的应用程序,所以我选择了 Thorntail,但在使用 mvn thorntail:run 启动它后,我'我收到了这个错误信息 Exceptio
我有几个使用 Thorntail 框架开发的微服务项目。我正在使用 Eclipse 编写代码。过去,我使用 Wildfly 应用程序服务器完成了所有开发工作,而 Eclipse 使调试这些应用程序变得
我正在创建一个简单的 Thorntail 服务,它将向远程 ActiveMQ 队列写入一条文本消息,并让 MDB 使用该消息。为了对此进行测试,我在本地 Docker 容器中运行了 ActiveMQ。
我有一个关于在 Thorntail 上配置 JMS 的小问题。在我的开发项目中,我使用 Wildfly,但对于远程服务器,我们使用(我的团队)IBM Portal。我将本地服务器从 Wildfly 升
如何使用项目默认 yaml 配置消息传递 activemq - thorntail 或 swarm 我目前遇到以下异常 资源“/subsystem=messaging-activemq/connect
我们目前将项目中的 Thorntail 版本从 2.5.0.Final 更新到 2.6.0.Final。 Caused by: org.eclipse.aether.transfer.Artifact
我在 docker 容器中运行 Spring Boot 和 Keycloak 时遇到问题。 我开始使用 Keycloak,mysql 作为 db 在 docker 中运行。 services: m
我开始使用thorntail V4 (www.thorntail.io)(以前称为wildfly swarm)来创建微服务。是的,我知道该网站将其称为“概念证明”。 Thorntail 附带 Unde
我正在尝试使用 @ConfigurationValue ,它应该从 project-defaults.yml 读取值,但是,我遇到了奇怪的行为,请参阅下面的代码。 我的 Controller : @A
我在通过从 Keycloak 收到的不记名 token 授权用户时遇到问题。 任务是将来自 Angular 应用程序的用户请求授权给我的后端 Thorntail 2.5.0.Final 微服务。我已经
我是一名优秀的程序员,十分优秀!