4.4. Red Hat Single Sign-On を使用したビジネスアプリケーションの設定
ほとんどの組織は、シングルサインオン (SSO) トークンを使用して、ユーザーおよびグループの詳細を提供します。Red Hat Single Sign-On (RHSSO) を使用して、サービス間のシングルサインオンを有効にし、一元的にユーザーとロールの設定や管理ができます。
前提条件
- business applications の Web サイトを使用して作成した Spring Boot アプリケーションの ZIP ファイルがある。
手順
- Red Hat シングルサインオン (SSO) をダウンロードします。Red Hat Single Sign-On スタートガイド を参照してください。
RHSSO を設定します。
デフォルトのマスターレルムを使用するか、新しいレルムを作成します。
レルムは、一連のユーザー、認証情報、ロール、およびグループを管理します。ユーザーはレルムに属し、レルムにログインします。レルムは相互に分離され、制御するユーザーのみを管理および認証できます。
-
springboot-app
クライアントを作成して、パブリックにAccessType
を追加します。 以下の例で示すように、ローカルの設定に合わせて有効なリダイレクト URI と Web オリジンを設定します。
-
有効なリダイレクト URI:
http://localhost:8090/*
-
Web オリジン:
http://localhost:8090
-
有効なリダイレクト URI:
- アプリケーションで使用するレルムロールを作成します。
- アプリケーションで使用するユーザーを作成してロールを割り当てます。
以下の要素およびプロパティーを Spring Boot プロジェクトの
pom.xml
ファイルに追加します。ここで、<KEYCLOAK_VERSION>
は使用している Keycloak のバージョンに置き換えます。<properties> <version.org.keycloak><KEYCLOAK_VERSION></version.org.keycloak> </properties>
以下の依存関係を Spring Boot プロジェクトの
pom.xml
ファイルに追加します。<dependencyManagement> <dependencies> <dependency> <groupId>org.keycloak.bom</groupId> <artifactId>keycloak-adapter-bom</artifactId> <version>${version.org.keycloak}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> .... <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> </dependency>
Spring Boot プロジェクトディレクトリーで
business-application-service/src/main/resources/application.properties
ファイルを開き、以下の行を追加します。# keycloak security setup keycloak.auth-server-url=http://localhost:8100/auth keycloak.realm=master keycloak.resource=springboot-app keycloak.public-client=true keycloak.principal-attribute=preferred_username keycloak.enable-basic-auth=true
business-application-service/src/main/java/com/company/service/DefaultWebSecurityConfig.java
ファイルを変更して、Spring Security が RHSSO で正しく機能することを確認します。import org.keycloak.adapters.KeycloakConfigResolver; import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; @Configuration("kieServerSecurity") @EnableWebSecurity public class DefaultWebSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); http .csrf().disable() .authorizeRequests() .anyRequest().authenticated() .and() .httpBasic(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); SimpleAuthorityMapper mapper = new SimpleAuthorityMapper(); mapper.setPrefix(""); keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(mapper); auth.authenticationProvider(keycloakAuthenticationProvider); } @Bean public KeycloakConfigResolver KeycloakConfigResolver() { return new KeycloakSpringBootConfigResolver(); } @Override protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } }