使用Spring-boot-starter将Spring Security中的HttpBasic和FormLogin混合使用

时间:2014-01-01 08:10:34

标签: spring spring-security

我使用spring-boot-starter 0.5.0.M6和spring security来构建我的应用程序,其中包含:

  1. “/ admin / ”**:任何人都可以访问角色ADMIN,基于表单的登录
  2. “/ api / ”**:任何人都应该可以访问角色API,http基本登录
  3. 我的第一次尝试是:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
          http
            .authorizeRequests()
              .antMatchers("/resources/**").permitAll()
              .antMatchers("/admin/**").hasRole("ADMIN")
            .and()
              .formLogin()
              .defaultSuccessUrl("/admin/home")
              .loginPage("/login")
              .permitAll()
            .and()
              .logout()
              .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET"))
              .permitAll();  
          http
            .authorizeRequests()
              .antMatchers("/api/**").hasRole("API")
            .and()
              .httpBasic();
    }
    

    采用这种方法:

    1. 所有“/ admin / ”和“/ api / ”都可以使用基本和&基于表单的登录。这不是一个关键问题。
    2. 发生任何安全问题时,例如:身份验证失败或授权失败,将显示登录表单。这是一个关键问题,我想如果/ api / **认证失败或授权失败,它会显示带有401/403状态代码的基本认证弹出窗口。
    3. 然后我尝试使用https://github.com/spring-projects/spring-security-javaconfig/blob/master/samples-web.md#sample-multi-http-web-configuration中的解决方案,但我只能保护/api/**/admin/**,但不能同时保护两者,取决于我使用@Order注释的那个

      请帮我一把。

      非常感谢

1 个答案:

答案 0 :(得分:4)

对于您的api部分,请使用以下内容。请注意第一个ant匹配器,它限制此安全配置筛选的范围。这是我最初从你的参考中不了解的部分。

@Configuration
@Order(1)
public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        // the ant matcher is what limits the scope of this configuration.
        http.antMatcher("/api/**").authorizeRequests()
            .antMatchers("/api/**").authenticated()
            .and().httpBasic().realmName("Sourcing API");
    }
}