web-dev-qa-db-ja.com

Spring Bootで事前認証ヘッダーベースの認証を設定するにはどうすればよいですか?

私のアプリは、Oracle Access ManagerSSOからユーザー名を含むAUTH_USERリクエストヘッダーを取得します。 Spring Securityの「AdditionalTopics」2.2.1には、私が必要としているように見える「PreAuth」の例がありますが、完全に機能する例ではありません。

以下のスニペットはドキュメント/例からのものであり、アノテーションベースの構成では機能しません。

Siteminderの構成例RequestHeaderAuthenticationFilterおよびPreAuthenticatedAuthenticationProviderおよびUserDetailsS​​erviceを使用してXMLを使用してユーザーを検索します。

これはJavaベースの構成にどのようにマップされますか?

<security:http>
  <!-- Additional http configuration omitted -->
  <security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</security:http>

<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
  <property name="principalRequestHeader" value="AUTH_USER"/>
  <property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.    PreAuthenticatedAuthenticationProvider">
  <property name="preAuthenticatedUserDetailsService">
    <bean id="userDetailsServiceWrapper"
          class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
      <property name="userDetailsService" ref="userDetailsService"/>
    </bean>
  </property>
</bean>

<security:authentication-manager alias="authenticationManager">
   <security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>

Spring Securityの事前認証の例では、セットアップが完全に異なります(XML構成はさらに威圧的です)。事前認証フィルターやヘッダー名の設定方法については言及されていません。

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login","/resources/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .jee()
                .mappableRoles("USER","ADMIN");
    }
}

Spring-boot-sample-web-secureは、WebSecurityConfigurerAdapterの代わりにWebMvcConfigurerAdapterを拡張し、基本的なフォームベースのログインを実行するだけで、認証前のAUTH_USERヘッダーからユーザーIDを取得する方法に関する情報はありません。

public class SampleWebSecureApplication extends WebMvcConfigurerAdapter {

... omitted...

    @Bean
    public ApplicationSecurity applicationSecurity() {
        return new ApplicationSecurity();
    }

    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
    protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {

        @Autowired
        private SecurityProperties security;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().fullyAuthenticated().and().formLogin()
                    .loginPage("/login").failureUrl("/login?error").permitAll();
        }
    }

}

私は多くのリファレンス/記事を読みましたが、それらは現在のコードとSpring-bootに関連していないようです。そのため、アプリの事前認証セキュリティを構成する方法を理解しようとして立ち往生しています。

13
Tim

これは、挿入されたuserServiceに基づいて事前認証セキュリティを構成する私の方法です。

@Configuration
@EnableWebSecurity
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true, securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

    private static final Logger LOG = Logger.getLogger(ApplicationSecurity.class.getName());

    @Autowired
    private UserService userService; // implements AuthenticationUserDetailsService...

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        LOG.info("configure autentication provider with custom userService");
        PreAuthenticatedAuthenticationProvider paaProvider = new PreAuthenticatedAuthenticationProvider();
        paaProvider.setPreAuthenticatedUserDetailsService(userService);
        auth.authenticationProvider(paaProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        LOG.info("configure autentication filter");
        // ...
    }

}
1
kinjelom