我有一个问题运行Spring启动和钥匙斗篷都在docker容器。
我从在docker中运行的数据库mysql的KeyClope开始。
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
然后我添加了我的领域(SpringBootKey斗篷)、我的客户机(testclient)和一个角色为“user”的用户。之后,我将Spring Security性添加到我的Spring Boot应用程序中。编辑了我的申请。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应用程序工作正常。我必须登录与键斗篷,并获得重定向到localhost:8090。但是当我把我的SpringBoot-Application添加到我的docker-comment中,并在一个容器中启动它时,我仍然可以登录键盘,但是当我应该重定向时,我会得到一个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。
我的工作方案包括以下内容:
要使事情正常运行,您需要确保将以下内容添加到您的主机文件(Mac/Linux上的/etc/host,Windows上的c:\Windows\System32\Drivers\etc\host)。
127.0.0.1钥匙斗篷
这是因为您将使用计算机上的浏览器(名称为localhost或127.0.0.1)访问您的应用程序,但在Docker内部,它将在自己的容器中运行,该容器的名称为KeyClope。
内部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:在Spring Boot的application.yml中编辑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-djboss.socket.binding.port-偏移=10设置默认端口(8080)偏移(10)其余的是键斗篷的默认值。不要忘记编辑"port"和"auth-server-url"
谢谢你的提问和回答!我为此挣扎了相当长的一段时间,并得到了连接拒绝错误。原因是我正在映射8180:8080,当我映射8080:8080时,一切都开始工作了!再次感谢!
我认为您的问题是auth服务器url:http://localhost:8180/auth
。当您的应用程序在docker容器中运行时,localhost
实际上具有不同的含义。
在容器内部,它需要是容器的名称,即keydape
。这有点尴尬,因为当您从主机连接到keydape时,您希望使用localhost
,但令牌颁发者url需要与请求令牌的url匹配(否则令牌将被拒绝),因此您必须将keydape
放入etc/hosts文件中。
你在这个问题上有很好的伙伴关系-我在与Activiti合作时遇到过这种情况。你可以找到JHipster项目以同样的方式处理它——他们说:
要使这些工作正常进行,您需要确保将以下内容添加到主机文件中(/etc/hosts
在Mac/Linux上,c:\Windows\System32\Drivers\etc\hosts
在Windows上)。
127.0.0.1密码
这是因为您将使用机器上的浏览器访问您的应用程序(名称是localhost
,或127.0.0.1
),但在Docker中,它将在自己的容器中运行,名称是钥匙斗篷
。
我用这个例子:https://github.com/foo4u/keycloak-spring-demo 我有钥匙斗篷。json文件在我的WEB-INF文件夹中,但当我运行应用程序时,会出现以下异常: 此异常的完整堆栈: 这段代码只是Spring Boot和KeyCloak集成的一个例子。 你能告诉我我做错了什么吗? 谢谢你的回答和时间。
我想得到帮助,使我的spring boot应用程序更安全。 我有一个RESTful API,目前没有实现安全性。另一个spring boot应用程序通过HTTP请求(GET、POST、PUT…)访问该API。 最近,我学习了一个REDHAT教程,该教程演示了如何使用keycloak制作一个更安全的Spring启动应用程序。 我想学习如何使用这个安全组合(springsecurity-keycloa
我正试图实现一个带有Spring Boot Restservice的Angular应用程序,该服务由KeyClope保护。 在我的电脑上,一切正常。Angular应用程序是由KeyClope引导的(使用KeyClope Angular),因此我必须登录才能查看该应用程序。应用程序将REST调用与令牌一起发送到Spring Boot。REST服务是KeyClope。承载者仅接收令牌,并使用令牌中的角
我正在开发一个连接到java(Spring框架)后端的角webapp。身份验证是通过密钥斗篷服务器完成的。 在我的带有嵌入式tomcat服务器的本地机器上,angular应用程序和spring应用程序运行正常。 对于部署,我需要使用传统的方式,使用现有的tomcat服务器。 角度前端在根目录中通过http://myurl/spring后端作为war文件放置,可以通过http://myurl/api
我正试图在我的spring boot应用程序中使用KeyClope。 我想根据REST方法和用户角色限制对特定URL的访问。 在下面的示例中,具有或角色的用户可以执行GET,而具有或角色的用户可以执行POST、PUT或DELETE。 不幸的是,此配置允许任何经过身份验证的用户访问/api/日历URL。我做错了什么?
我有一个springcloudmicroservices项目,它使用springcloudconfig服务器管理配置,使用Eureka服务器进行服务发现。 我的应用程序一直做得很好,直到我想添加一个新的带有键斗篷的微服务。这个新的微服务只是我的Vue前端应用程序的一个Rest应用编程接口,用户管理预计将由KeyCloak处理。 新服务运行正常,并将其自身注册到Eureka,直到我将KeyClope