ドッカー(春ブーツやThorntail)とKeycloak

Dagger87:

私は両方のドッキングウィンドウの容器に春ブーツとKeycloakを実行している問題を抱えています。

DBがドッキングウィンドウで実行されているように私は、MySQLとKeycloakで開始しました。

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)、およびロール 'ユーザを持つユーザーを追加しました。その後、私は私の春ブーツ・アプリケーションに、バネのセキュリティを追加しました。そして、私の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を追加したことにaccoring:

  /**
   * 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-アプリケーションを実行すると、正常に動作しています。8090:私はkeycloakでログインすると、ローカルホストにリダイレクトできます。私は私のドッキングウィンドウ-構成するために私のSpringBoot-アプリケーションを追加して、コンテナ内で起動した場合でも、私はログインのため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"}

私はこの問題を解決する方法を見つけ出すことはできません...

EDIT 1:ワンより多くの情報:私はWindows上でドッキングウィンドウを実行していますよ。

EDIT 2:A SOLUTION

私のワーキングソリューションは、次のものが含まれます。

  1. ステップは、ホストとしてkeycloak追加します

(:\ WINDOWS \ System32に\ drivers \ etcに\ Windowsホスト上の/ etc / Mac用/ Linuxでは、Cのホスト)、物事を動作させるには、あなたのhostsファイルに以下を追加することを確認する必要があります。

127.0.0.1 keycloak

あなたは(名前はlocalhostです、または127.0.0.1)お使いのマシンのブラウザを使用してアプリケーションにアクセスするためですが、ドッカーの内側には、名前がkeycloakある独自のコンテナで実行されます。

  1. ステップ

インナードッカーポート、および公開ポートが同じである必要があります:

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でkeycloak定義編集した認証サーバー-URL:

    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

醜い事は、このソリューションに来て:あなたは、URLからのアクセスに別のポートにあなたのドッカーポートをマッピング傾けます。ポート: - 8080:8080私は、アクセスURLポートは(私の場合は8080)は、内側ドッカポートと同じである必要があり、その結果、他の組み合わせをテストに多くの時間を費やしています。

EDIT 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"

...ドッキングウィンドウ・コンでkeycloakため。-Djboss.socket.binding.portオフセット= 10組のデフォルトポート(8080)+オフセット(10)残りはkeycloakのデフォルト値です。「ポート」と「認証サーバー-URL」編集することを忘れないでください

ライアン・ドーソン:

私はあなたの問題があると思いますauth-server-url: http://localhost:8180/authそれはlocalhost効果的にあなたのアプリがドッキングウィンドウコンテナ内で実行されている別の意味を持っています。

容器の内部には、コンテナすなわちの名前である必要がありますkeycloakあなたのホストマシンからkeycloakに接続するときに使用したいと思いますので、これは少し厄介ですlocalhostが、トークン発行URLのニーズがトークンを要求されたURLに一致させるためにあなたが持ってしまうので(そうでない場合はトークンが拒否されます)置くためにkeycloakあなたのetc / hostsファイルに。

あなたはこの問題に良い会社である-私はこの遭遇したActivitiで作業をそして、あなたが見つけることができるのと同じ方法でそれを扱うJHipsterプロジェクトを -彼らは言います:

物事の仕事を作るために、あなたは(あなたのhostsファイルに以下を追加することを確認する必要があります/etc/hosts、MAC / Linux上でc:\Windows\System32\Drivers\etc\hostsWindows上で)。

127.0.0.1 keycloak

あなたは(ある名前を使用しているマシン上のブラウザを使用してアプリケーションにアクセスするためですlocalhost127.0.0.1)が、ドッカーの内側にそれは名前があり、独自のコンテナで実行されますkeycloak

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=202589&siteId=1