GeekFactory

int128.hatenablog.com

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を使う必要があるのですが、まともな開発環境を整備するためにいろいろと苦労したので知見をまとめておきます。

前提:

希望:

  • zshを使いたい
  • プライベートで使っているmacOSのdotfilesをそのまま使いたい
  • gitコマンドが遅いと辛い
  • npm installでネイティブコードのコンパイルが通らない問題で疲弊したくない
  • LinuxmacOSのバイナリしか配布されていないコマンドを使いたい

という条件を満たすため、以下を利用しています。

  • WSL (Windows Subsystem for Linux)
  • VcXsrv
  • WSLで使っているもの
    • xterm(フォントがきれいなので使っている)
    • zsh
    • vim
    • git
    • node
    • php
    • openjdk
    • IntelliJ IDEA(idea-fsnotifier-wsl のパッチを当てて使っている)
    • kubectl, helm, ...
    • aws-cli
    • gcloud
    • terraform
    • docker, docker-compose(Docker for Windowsへのクライアント)
  • Windowsに残しているもの
    • Chrome
    • Visual Studio Code(まだWSLでは動かない)
    • GoLand
    • Docker for Windows(WSLでは動かない)
    • wslgitVisual Studio CodeからWSLのgitを利用するため)
    • GVIM(ちょっとテキストを開く時に便利なので残している)
  • Dockerで使っているもの

現時点の課題:

ざっと書き出すとこんな感じです。

dotfilesはmacOSと共通のものを使っています。

github.com

nextcloudとKeycloakのSAML SSO

TL;DR

以下の環境で確認しています。

  • 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/*
  • マッパー
    • SAML属性 username → User Property username
    • SAML属性 email → User Property email

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----- で囲むのをお忘れなく。
  • Attribute mapping
    • Attribute to map the displayname to: username
    • Attribute to map the email address to: email

なお、SAML SSOを有効にするとローカルユーザでログインできなくなるため、ローカルユーザのウィンドウを開いたまま作業してください。シークレットウィンドウでnextcloudを開いて動作確認するとよいでしょう。

デフォルトでは、SSO後にユーザが存在しない場合は自動的に作成してくれます。

まとめ

KeycloakでID管理を統合すると便利なのでおすすめです。ついでに、バックエンドストレージをS3にしておくとメンテナンスも楽です。