4.3. 事前認証での Spring セキュリティーの使用
PermitAll
メソッドを使用して Spring Security 認証を無効にすると、すべてのユーザーはアプリケーションにログインできますが、ユーザーのアクセスと機能は限定されます。ただし、ユーザーを事前に認証できるため (指定されたサービスアカウントなど)、ユーザーのグループは同じログインを使用できますが、ユーザーのグループに必要なすべてのパーミッションが付与されます。このため、各ユーザーに認証情報を作成する必要はありません。
事前認証を実装する最も簡単な方法は、カスタムフィルターサーブレットを作成し、DefaultWebSecurityConfig
クラスのセキュリティー FilterChain の前に追加することです。これにより、カスタマイズされたプロファイルベースのセキュリティーコンテキストを挿入し、そのコンテンツを制御して、シンプルに保つことができます。
前提条件
- Red Hat Process Automation Manager Spring Boot アプリケーションがあり、Spring Security を 「Red Hat Process Automation Manager ビジネスアプリケーションでの Spring Security の無効化」 に従って無効化している。
手順
AnonymousAuthenticationFilter
クラスを拡張する以下のクラスを作成します。import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.AnonymousAuthenticationFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; public class <CLASS_NAME> extends AnonymousAuthenticationFilter { private static final Logger log = LoggerFactory.getLogger(<CLASS_NAME>.class); public AnonymousAuthFilter() { super("PROXY_AUTH_FILTER"); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { SecurityContextHolder.getContext().setAuthentication(createAuthentication((HttpServletRequest) req)); log.info("SecurityContextHolder pre-auth user: {}", SecurityContextHolder.getContext()); if (log.isDebugEnabled()) { log.debug("Populated SecurityContextHolder with authenticated user: {}", SecurityContextHolder.getContext().getAuthentication()); } chain.doFilter(req, res); } @Override protected Authentication createAuthentication(final HttpServletRequest request) throws AuthenticationException { log.info("<ANONYMOUS_USER>"); List<? extends GrantedAuthority> authorities = Collections .unmodifiableList(Arrays.asList(new SimpleGrantedAuthority("<ROLE>") )); return new AnonymousAuthenticationToken("ANONYMOUS", "<ANONYMOUS_USER>", authorities); } }
以下の変数を置き換えてください。
-
<CLASS_NAME>
を、このクラスの名前 (AnonymousAuthFilter
など) に置き換えます。 -
<ANONYMOUS_USER>
をユーザー ID (Service_Group
など) に置き換えます。 -
<ROLE>
を<ANONYMOUS_USER>
に付与する必要がある権限を持つロールに置き換えます。
-
<ANONYMOUS_USER>
に複数のロールを割り当てる必要がある場合は、以下の例に示すようにロールを追加します。.unmodifiableList(Arrays.asList(new SimpleGrantedAuthority("<ROLE>") , new SimpleGrantedAuthority("<ROLE2>")
.anonymous().authenticationFilter(new <CLASS_NAME>()).and()
をbusiness-application-service/src/main/java/com/company/service/DefaultWebSecurityConfig.java
ファイルに追加します。<CLASS_NAME>
は作成したクラス名に置き換えます。@Override protected void configure(HttpSecurity http) throws Exception { http .anonymous().authenticationFilter(new <CLASS_NAME>()).and() // Override anonymousUser .cors().and().csrf().disable() .authorizeRequests() .antMatchers("/*").permitAll() .and().headers().frameOptions().disable(); }