Spring Boot 2和迁移OAuth2配置

时间:2018-03-05 10:21:35

标签: java spring-boot spring-security

我们正在将Spring Boot 1.5.7应用程序迁移到Spring Boot 2,我注意到SecurityProperties.ACCESS_OVERRIDE_ORDER不再可用。

我们正在使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER))来强制安全配置过滤器的某个顺序,并且在没有此注释的情况下它不再工作(因为安全过滤器的顺序错误而获得不同的状态)。是否有一些更换或配置更改,以使其以旧方式工作?

我们已经有了基本的auth + OAuth2。

这是我们使用的OAuth2依赖项:

compile group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: '2.1.0.RELEASE'

编辑:这是我的WebSecurity属性:

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  private static final String LOGIN = "/login";
  private static final String LOGOUT_SUCCESS = "/login?logout";

  private final UserDetailsService userDetailsService;
  private final AuthenticationManager authenticationManager;

  public WebSecurityConfig(UserDetailsService userDetailsService, @Lazy AuthenticationManager authenticationManager) {
    this.userDetailsService = userDetailsService;
    this.authenticationManager = authenticationManager;
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {

    // @formatter:off
    http
      // enable cors
      .cors().and()
      .requestMatchers().antMatchers("/oauth/**", "/*").and()
      // These from the above are secured by the following way
      .authorizeRequests().antMatchers("/").permitAll()
      // These from the rest are secured by the following way
      .anyRequest().authenticated().and()
      // Set login page
      .formLogin().loginPage(LOGIN).permitAll().defaultSuccessUrl(PROFILE)
      // Set logout handling
      .and().logout().logoutSuccessUrl(LOGOUT_SUCCESS);
      // @formatter:on

  }

  @Override
  public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.parentAuthenticationManager(authenticationManager);
    auth.userDetailsService(userDetailsService);
  }

}

通过REST访问/user时,我希望401 - Unauthorized没有有效令牌。相反,我得到302 - Redirect to /login意味着基本身份验证具有更高的优先级。我不知道如何解决这个问题,因为我尝试使用的任何订单都不起作用。

2 个答案:

答案 0 :(得分:1)

有同样的问题。只是为了猴子修补(稍后将研究@Order注释的真实含义),我发现在{。{}}版本的1.5。*版本中为ACCESS_OVERRIDE_ORDER分配了什么值,它似乎是{ {1}} ...

答案 1 :(得分:1)

因此,事实证明问题不在我的WebSecurity配置中,但它有点复杂。 Spring Security 5要求clientSecret在默认情况下使用BCrypt进行加密,这是我遗漏的。此外,添加AuthenicationManager bean解决了这个问题。

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
           return super.authenticationManagerBean();
}

我在github上有一个带有此功能的示例项目,但我会稍微改进一下以解决其他一些问题。