49

Spring Boot の組み込み Tomcat インスタンスと連携するように Spring Security をセットアップしようとしています。これを行う基本的なサンプルはかなりの数ありますが、私はそれらが終了したところで立ち往生しています。それらは HTTP (HTTPS ではなく) を介して基本的な認証を行います。

Tomcat 構成ファイル ( ) にアクセスできる場合はおそらく機能させることができますserver.xmlが、Spring Boot は組み込みの Tomcat インスタンスを使用するため (そうでなければ非常に便利です)、Tomcat 構成ファイルにアクセスすることはできません (少なくとも、私の知識)。

これには設定があるかもしれapplication.propertiesませんが、追跡できませんでした。Tomcat の構成ファイルの置き換えに関係があるのではないかと思われるserver.contextPathフィールドへの参照を見てきました。application.properties関連していたとしても、とにかくどこから始めればよいかわかりません.Tomcat SSLの指示はすべて、既存のserver.xmlファイルを編集することから始まり、ゼロから構築することではありません.

これは Spring Boot で実行できますか (何らかの方法でスニペットを指定するserver.xmlか、他の手段を介して)。そうでない場合、これを行う最も簡単な方法は何ですか? Spring Boot の Tomcat コンポーネントを除外する必要があるかもしれないことは理解していますが、可能であればそれを避けたいと考えています。

4

5 に答える 5

67

Spring Boot 1.2 以降では、application.propertiesまたはを使用して SSL を構成できますapplication.yml。の例を次に示しapplication.propertiesます。

server.port = 8443
server.ssl.key-store = classpath:keystore.jks
server.ssl.key-store-password = secret
server.ssl.key-password = another-secret

と同じことapplication.yml

server:
  port: 8443
  ssl:
    key-store: classpath:keystore.jks
    key-store-password: secret
    key-password: another-secret

現在のリファレンス ドキュメントへのリンクは次のとおりです。

于 2014-08-29T06:44:03.797 に答える
19

これを行う方法があることがわかりましたが、これには複数のプロジェクトからソースコードを読むのに何時間も必要だったので、「適切な」方法を見つけたかどうかはわかりません. 言い換えれば、これはばかげた作業かもしれません (しかし、機能します)。

まず、組み込み Tomcat の server.xml にアクセスして、それを拡張したり置き換えたりする方法がありません。これはプログラムで行う必要があります。

第二に、「require_https」設定は、証明書情報をそのように設定できないため、役に立ちません。http から https への転送を設定しますが、https を機能させる方法は提供されないため、転送は役に立ちませんただし、以下のものと一緒に使用すると、httpsが機能します。

まず、組み込みサーブレット コンテナ サポート ドキュメントEmbeddedServletContainerFactoryで説明されているように、を提供する必要があります。ドキュメントは Java 用ですが、Groovy はほとんど同じように見えます。例で使用されている注釈を認識させることはできませんでしたが、必要ではないことに注意してください。groovy の場合は、これを新しい .groovy ファイルに入れて、ブートの起動時にそのファイルをコマンド ラインに含めるだけです。@Valuespring

ここで、そのコードで作成したクラスをカスタマイズして、TomcatEmbeddedServletContainerFactoryweb.xml の動作を変更できると説明されていますが、これは事実ですが、動作を調整するためにも使用できることを知っておくことが重要ですserver.xml。実際、クラスのソースを読んで組み込み Tomcat のドキュメントと比較すると、これが唯一の場所であることがわかります。興味深い関数は ですTomcatEmbeddedServletContainerFactory.addConnectorCustomizers()。これは、Javadocs からはあまり見えないかもしれませんが、実際には組み込み Tomcat オブジェクトを提供して、自分でカスタマイズすることができます。独自の実装を渡し、関数で指定さTomcatConnectorCustomizerれたものに必要なものを設定するだけです。現在、 でできることは約 10 億ありますが、役に立つドキュメントは見つかりませんでしたが、Connectorvoid customize(Connector con)ConnectorcreateConnector()この人の個人的なSpring-embedded-Tomcatプロジェクトの機能は、非常に実用的なガイドです. 私の実装は次のようになりました。

package com.deepdownstudios.server

import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.*
import org.springframework.stereotype.*

@Configuration
class MyConfiguration {

@Bean
public EmbeddedServletContainerFactory servletContainer() {
final int port = 8443;
final String keystoreFile = "/path/to/keystore"
final String keystorePass = "keystore-password"
final String keystoreType = "pkcs12"
final String keystoreProvider = "SunJSSE"
final String keystoreAlias = "tomcat"

TomcatEmbeddedServletContainerFactory factory = 
        new TomcatEmbeddedServletContainerFactory(this.port);
factory.addConnectorCustomizers( new TomcatConnectorCustomizer() {
    void    customize(Connector con) {
        Http11NioProtocol proto = (Http11NioProtocol) con.getProtocolHandler();
            proto.setSSLEnabled(true);
        con.setScheme("https");
        con.setSecure(true);
        proto.setKeystoreFile(keystoreFile);
        proto.setKeystorePass(keystorePass);
        proto.setKeystoreType(keystoreType);
        proto.setProperty("keystoreProvider", keystoreProvider);
        proto.setKeyAlias(keystoreAlias);
    }
});
return factory;
}
}

Autowiring は、この実装を選択して実行します。バストされたキーストアファイルを修正したら(他の場所で報告されているので-storetype pkcs12はなく、 keytool を で呼び出すようにしてください)、これは機能しました。-storepass pkcs12また、テストなどの構成設定としてパラメーター (ポート、パスワードなど) を提供する方がはるかに良いでしょう... @Value アノテーションを取得して Groovy で動作させることができれば、それが可能であると確信しています。

于 2013-10-28T04:44:16.407 に答える
0

を実装したくない場合は、事前定義された を提供するライブラリ ( https://github.com/ycavatars/spring-boot-https-kitconnector customizer ) をビルドしてインポートできます。README によると、キーストアを作成し、構成し、ライブラリをインポートし、追加するだけです。その後、HTTPS 接続が確立されます。connector customizerconnector.https.*@ComponentScan("org.ycavatars.sboot.kit")

于 2014-06-11T07:53:11.150 に答える