如何在 Spring Boot 中设置基于预认证头的认证?

Posted

技术标签:

【中文标题】如何在 Spring Boot 中设置基于预认证头的认证?【英文标题】:How to setup pre-authentication header-based authentication in Spring Boot? 【发布时间】:2014-11-22 02:21:06 【问题描述】:

我的应用程序从 Oracle Access Manager SSO 获得一个带有用户名的 AUTH_USER 请求标头。 Spring Security “Additional Topics” 2.2.1 有一个“PreAuth”示例,这似乎是我需要的,但不是一个完整的工作示例。

以下片段来自文档/示例,不适用于基于注释的配置。

Siteminder 示例配置 - 使用带有 RequestHeaderAuthenticationFilterPreAuthenticatedAuthenticationProvider 以及 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 preauth 示例具有完全不同的设置(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 扩展了 WebMvcConfigurerAdapter 而不是 WebSecurityConfigurerAdapter,只进行基本的基于表单的登录,没有关于如何从预授权 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 无关,因此一直试图了解如何配置应用程序的预授权安全性。

【问题讨论】:

解释你看到的行为会有很大帮助。也就是说,您的描述显示您正在获取 AUTH_USER,但 principalRequestHeader 设置为“SM_USER”。 谢谢,德文。行为是我无法通过注释获得 Spring 配置甚至成功。以上是示例中的代码 sn-ps。这些变化使我很难确定我什至应该创造什么:即。 WebSecurytConfigurerAdapter 还是 WebMvcConfigurerAdpater?当我尝试配置 RequestHeaderAuthenticationFilter 时,它需要几个嵌套的 bean,如 AuthenticationManager 和 AuthProvider 和 DetailsS​​ervice,但 HttpSecurity http 对象也有设置 authprovider 和 details 服务的方法,但类型略有不同。 刚刚看了Spring Security 3.2 Webinar,这对理解一些注释和配置有很大帮助。接下来,我将阅读整个Spring Security Reference @Pavan - 不,一直在讨论其他主题,但还没有弄清楚。有兴趣请点赞! :-) @Tim:现在可以吗?无论如何这里是 URL github.com/sallampalli/codewiki/tree/master/… 【参考方案1】:

这是我基于注入的 userService 配置 pre-auth 安全性的方式:

@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");
        // ...
    


【讨论】:

以上是关于如何在 Spring Boot 中设置基于预认证头的认证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring boot中设置禁用浏览器缓存?

如何使用 WebFlux 在 Spring Boot 2 中设置登录页面?

如何使用WebFlux在Spring Boot 2中设置登录页面?

如何在 Spring Boot 中设置过滤器链?

Spring 如何在 Spring Boot 中设置数据源

如何在 Spring Boot 中设置 enableLoggingRequestDetails='true'