SpringSecurityの動作原理とカスタマイズ
最終更新日: 2021年3月9日
R8 | R9
2019年7月4日 Wagby Tech Meet 2019 で発表した資料です。Spring Security の概要およびシングル・サインオンについて説明しています。
Spring が提供する PasswordEncoder の仕組みに準拠した、パスワードハッシュ化のカスタマイズ方法を説明します。
Spring Security が提供している
カスタマイズクラスとして Spring の Configuration クラスを作成し、1. で用意した PasswordEncoder を Bean 定義します。
パッケージ名が「jp.jasminesoft.wagby」の場合は、作成した Configuration クラスは customize/java/jp/jasminesoft/wagby/autoconfiguration フォルダにに配置してください。
export/data_init/init/juser フォルダを customize/webapp/WEB-INF/export/init/juser へコピーし、item_0.xml, item_1.xml 内の
<password> 要素の値を書き換えます。いずれもハッシュ化前のパスワードは "wagby" です。
"wagby" という文字を 2. で定義した PasswordEncoder に対応したハッシュ値に置き換えてください。パスワードのハッシュ値を事前に求める場合は、インターネットで公開されているサービスをご利用いただくことができます。例えば次のようなサービスがあります。[2019年3月現在]
customize/java/jp/jasminesoft/wagby/autoconfiguration/MyConfiguration.java ファイルのサンプルを示します。ここでは Spring が提供する BCryptPasswordEncoder を使ってハッシュ値を求めています。
Wagby の OpenID Connect (OIDC) 認証では、emailフィールドをユーザー識別子に用いるように設定変更しています。具体的には application.properties に次の行を出力するようにしています。[詳細...]
このユーザー識別子をカスタマイズするポイントを用意しています。
具体的には、OidcUsernameResolverインタフェースの実装クラスをBeanとして登録します。customize/java/jp/jasminesoft/wagby/autoconfigurationフォルダにSampleUsernameResolver.javaを用意した例を示します。
次のようなケースがあります。
資料
PasswordEncoderのカスタマイズ
1. PasswordEncoder インタフェースの実装クラスを用意する
org.springframework.security.crypto.password.PasswordEncoder
インタフェースの実装クラスを用意します。なお Spring Security に同梱されている PasswordEncoder 派生クラスを利用することもできます。その場合は独自クラスの作成は不要です。
2. Configuration クラスを作成する
@Configuration
public class MyConfiguration {
/**
* {@link PasswordEncoder} の bean 定義。
* @return {@link PasswordEncoder}
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new ${任意のPasswordEncoderクラス};
}
}
3. admin, jobadmin の初期データを用意する
[参考] MyConfiguration クラスのサンプル
package jp.jasminesoft.wagby.autoconfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* カスタマイズ用の Configuration クラスです。
* {@link PasswordEncoder} を独自実装に変更しています。
*
* @author JasmineSoft
* @version $Revision$ $Date$
*/
@Configuration
public class MyConfiguration {
/**
* {@link PasswordEncoder} の bean 定義。
* @return {@link PasswordEncoder}
*/
@Bean
public PasswordEncoder passwordEncoder() {
// BCrypt を利用する。
// ストレッチング回数には15を指定。
// ストレッチング回数を省略するとデフォルトの10が適用される。
return new BCryptPasswordEncoder(15);
}
}
OIDC認証におけるユーザ識別子のカスタマイズ
spring.security.oauth2.client.provider.google.user-name-attribute=email
@Component
public class SampleUsernameResolver implements OidcUsernameResolver {
@Override
public String resolve(Map<String, Object> claims, String username) {
if ("hoge@gmail.com".equals(username)) {
// hoge@gmail.com で認証した場合は、Wagby 側では
// 特別に admin としてログオンさせる。
return "admin";
}
return username;
}
}
応用例