拡張Spring——外部属性ファイルセキュリティ(一)


前言
Springの開発では、多くの場合、プレースホルダを使用してプロパティファイルのプロパティ値を参照し、システムを簡素化し、システムの柔軟性と汎用性を向上させます.この構成には2つの明らかなメリットがあります.
-メンテナンスの作業量を減らす:資源の配置情報は多く応用して共有することができ、複数の応用が同じ資源を使用する場合、資源の住所、ユーザー名などの配置情報が変更された場合、あなたは属性ファイルを調整すればよい;
-配置を簡単にする:Springプロファイルは主にアプリケーションのBeanを説明する.これらの構成情報は開発が終わった後、固定されたはずである.アプリケーションを配置する時、配置環境によってデータソース、メールサーバーの構成情報を調整し、それらの構成情報を属性ファイルに独立させる必要がある.アプリケーション・デプロイメント担当者は、リソース・プロパティ・ファイルを調整するだけで、複雑なSpringプロファイルに注目する必要はありません.導入とメンテナンスが容易になるだけでなく、エラーの確率も低下します.
    Springは、外部属性値を参照したを処理し、実際の構成値に翻訳するBeanFactoryPostProcessorBeanファクトリのバックグラウンドプロセッサインタフェースの実装クラスを提供します.
    一般的な属性情報は明示的に属性ファイルに格納されて問題はありませんが、データソースやメールサーバのユーザー名パスワードなどの重要な情報であれば、場合によっては密文で保存する必要がある場合があります.Webアプリケーションのクライアント・ユーザーにはプロファイルが表示されない場合がありますが、デプロイメント・マシンにアクセスできるすべてのユーザーに対して、保留せずにオープンするのではなく、特定の保守担当者が重要なリソースの構成情報を把握することを望んでいる場合があります.
    このような高度なセキュリティ要件を有するシステム(電気通信、銀行、重点人口ライブラリなど)については、リソース接続などのプロパティプロファイルの構成情報を暗号化して保存する必要があります.次にSpringコンテナを起動させ、プロファイルを読み込んだ後、先に復号してからプレースホルダの置換を行います.
    残念ながら、PropertyPlaceholderConfigurerは明文のプロパティファイルのみをサポートしています.しかし、Springフレームワークの拡張性を十分に活用し、P r e p e r t y PlaceholderConfigurerクラスを拡張することで、私たちの要件を達成することができます.この文書では、暗号化されたプロパティファイルを使用する原理について説明し、具体的な実装を提供します.
   
従来の方法でプロパティファイルを使用する
    一般に、外部プロパティファイルは、データ・ソースやメール・サーバなどの構成情報を定義するために使用されます.ここでは、プロパティファイルを使用する方法を簡単な例で説明します.car.propertiesプロパティファイルがあるとします.ファイルの内容は次のとおりです.
    brand=赤旗CA 72
    maxSpeed=250
    price=20000.00
    このファイルはクラスパスのcom/baobaotao/ディレクトリの下に配置され、SpringプロファイルでPropertyPlaceholderConfigurerを使用してこのプロファイルを導入し、コードリスト1に示すように、プレースホルダを使用してプロパティファイル内のプロパティ項目を参照します.
コードリスト1外部プロパティファイルを使用して構成

<!-- ①          -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
       <list>
          <value>classpath:com/baobaotao/car.properties</value> ②         
       </list>
    </property>
    <property name="fileEncoding" value="utf-8"/>
</bean>
<!-- ③         , car     -->
<bean id="car" class="com.baobaotao.place.Car">
    <property name="brand" value="${brand}" />
    <property name="maxSpeed" value="${maxSpeed}" />
    <property name="price" value="${price}" />
</bean>

    ①では、クラス参照外部のプロパティファイルをP r e t y P e r t y P r e c e holderConfigurerというBeanFactoryPostProcessorで実装し、そのlocationsプロパティでSpringプロファイルで参照されるプロパティファイルを指定します.P r e r t y P l e c e holderConfigurer内部では、locationsはResource配列なので、アドレスの前にリソースタイププレフィックスを追加することができます.②に示すように.複数のプロパティファイルを参照する必要がある場合は、②に対応するプロファイル項目を追加するだけです.
    PropertyPlaceholderConfigurer構造の解析
    SpringはP r o p e r t y P r e c e holderConfigurerを通じて外部属性ファイルのサポートを提供していることを知っています.暗号化された属性ファイルを使用するために、このクラスの動作メカニズムを分析し、改造する必要があります.まず、このクラスの構造を理解してみましょう(添付ファイル1を参照).
    ここで、PropertiesLoaderSupportクラスには重要なprotected void loadProperties(Properties props)メソッドがあり、そのコメントを表示します.このメソッドの役割は、PropertyPlaceholderConfigurerのlocationsプロパティで定義されたプロパティファイルの内容をpropsパラメータオブジェクトに読み込むことです.この方法は比較的奇妙で,Javaはインパラメータによって値を返すことは少ないが,この方法はそうである.
    したがって,この方法を簡単に再ロードし,リソースファイルの内容をPropertiesに変換する前に,復号化のステップを追加すればよい.しかし、PropertiesLoaderSupportの設計には残念な点があり、locations属性はprivateであり、setterのみを提供し、getterを提供していない.したがって、PropertiesLoaderSupportのlocations(リソースアドレス)をサブクラスで取得することはできません.そのため、サブクラスでlocationsプロパティを再定義し、PropertiesLoaderSupportのsetLocations()メソッドを上書きする必要があります.