spring.config.locationを複数指定した場合の優先順位
Spring Bootで --spring.config.location
に複数のプロパティファイル(またはYAMLファイル)を指定した場合の優先順位を調べてみました。
TL;DR
--spring.config.location
にはカンマ区切りで複数のプロパティファイルを指定できる。- 後に指定したプロパティファイルで値が上書きされる。
- 例えば
a.yaml,b.yaml,c.yaml
を指定した場合、c.yaml
の定義値、b.yaml
の定義値、a.yaml
の定義値の順に検索される。
試してみた
Spring Boot 2.0.0.M7で試してみました。
@ConfigurationProperties("foo") @RestController class Example { var bar: String = "default.bar" var baz: String = "default.baz" @RequestMapping("/") fun index() = "bar=$bar, baz=$baz" }
http://localhost:8080 でどんな値が返るか確認します。
何も指定しない場合
bar=default.bar, baz=default.baz
YAMLを1つ指定した場合
# a.yaml foo: bar: a baz: x
--spring.config.location=a.yaml
bar=a, baz=x
YAMLを2つ指定した場合
# a.yaml foo: bar: a baz: x
# b.yaml foo: bar: b baz: y
--spring.config.location=a.yaml,b.yaml
bar=b, baz=y
YAMLを2つ指定したが未定義の値がある場合
# a.yaml foo: bar: a baz: x
# b.yaml foo: bar: b
--spring.config.location=a.yaml,b.yaml
bar=b, baz=x
YAMLを3つ指定したが未定義の値がある場合
# a.yaml foo: bar: a baz: x
# b.yaml foo: bar: b baz: y
# c.yaml foo: bar: c
--spring.config.location=a.yaml,b.yaml,c.yaml
bar=c, baz=y
See Also
Windows Subsystem for Linuxで開発環境を作る
会社ではWindowsを使う必要があるのですが、まともな開発環境を整備するためにいろいろと苦労したので知見をまとめておきます。
前提:
- Windows 10
- プロキシなし
希望:
- zshを使いたい
- プライベートで使っているmacOSのdotfilesをそのまま使いたい
- gitコマンドが遅いと辛い
- npm installでネイティブコードのコンパイルが通らない問題で疲弊したくない
- LinuxかmacOSのバイナリしか配布されていないコマンドを使いたい
という条件を満たすため、以下を利用しています。
- WSL (Windows Subsystem for Linux)
- VcXsrv
- WSLで使っているもの
- Windowsに残しているもの
- Chrome
- Visual Studio Code(まだWSLでは動かない)
- GoLand
- Docker for Windows(WSLでは動かない)
- wslgit(Visual Studio CodeからWSLのgitを利用するため)
- GVIM(ちょっとテキストを開く時に便利なので残している)
- Dockerで使っているもの
- mysql
- redis
現時点の課題:
- Xにおける日本語入力(
atokでよさそうATOK for Linuxは販売終了) - WSLからWindowsのファイルシステムにアクセスするとパーミッションが777に見える
- Windowsネイティブ、xterm、GTKでフォントレンダラーが異なる
ざっと書き出すとこんな感じです。
dotfilesはmacOSと共通のものを使っています。
nextcloudとKeycloakのSAML SSO
TL;DR
- nextcloudはオープンソースのファイルストレージサービスです。SAML SSOに対応しています。
- Keycloakはオープンソースの統合ID管理ツールです。OpenID ConnectやSAMLによる認証を提供しています。
以下の環境で確認しています。
- nextcloud 12.0
- Keycloak 3.4.0.Final
具体的な手順
Keycloakで新しいClientを追加します。認証連携したいユーザがいるRealmで作業してください。
- クライアントID:
https://nextcloud.example.com/index.php/apps/user_saml/saml/metadata
- クライアントプロトコル: saml
- クライアント署名が必須: OFF
- 有効なリダイレクト URI:
https://nextcloud.example.com/*
- マッパー
nextcloudで「SSO & SAML authentication」を設定します。
- Attribute to map the UID to:
username
- Identity Provider Data
- Identifier of the IdP entity (must be a URI):
https://keycloak.example.com/auth/realms/YOUR_REALM
- URL Target of the IdP where the SP will send the Authentication Request Message:
https://keycloak.example.com/auth/realms/YOUR_REALM/protocol/saml
- Public X.509 certificate of the IdP: インストレーションでSAML Metadata IDPSSODescriptorを選択するとXMLが表示されるので、<dsig:X509Certificate> 要素に入っているBASE64文字列を入力します。
-----BEGIN CERTIFICATE-----
と-----END CERTIFICATE-----
で囲むのをお忘れなく。
- Identifier of the IdP entity (must be a URI):
- Attribute mapping
- Attribute to map the displayname to:
username
- Attribute to map the email address to:
email
- Attribute to map the displayname to:
なお、SAML SSOを有効にするとローカルユーザでログインできなくなるため、ローカルユーザのウィンドウを開いたまま作業してください。シークレットウィンドウでnextcloudを開いて動作確認するとよいでしょう。
デフォルトでは、SSO後にユーザが存在しない場合は自動的に作成してくれます。
まとめ
KeycloakでID管理を統合すると便利なのでおすすめです。ついでに、バックエンドストレージをS3にしておくとメンテナンスも楽です。