单个Web应用程序路径上的spring-boot设置基本身份验证?

问题描述 投票:5回答:2

我正在尝试在基于spring-boot spring MVC的应用程序中设置单个路径(/基本),以进行基本身份验证保护。我将使用自己的自定义配置参数进行配置,因此用户名和密码仅为“ admin”和“ admin”。

目前这适用于/ basic路径(系统会提示我并可以正确登录)。问题是注销不起作用(我不确定为什么),并且要求其他路径(如/ other所示)获得基本身份验证凭据(在始终被拒绝之前)。

static class MyApplicationSecurity extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/open").permitAll();
        http.authorizeRequests().antMatchers("/other").denyAll(); // Block it for now
         http.authorizeRequests().antMatchers("/basic").authenticated().and().httpBasic().and().logout().logoutUrl("/basic/logout").invalidateHttpSession(true).logoutSuccessUrl("/");
    }
}

我希望/ other总是被拒绝,但是我不明白为什么要进行基本身份验证。 / open可以正常工作。我也不明白为什么/ basic / logout不注销我(它也不会产生错误消息)。我确实有一些简单的代码作为注销端点的占位符,但是如果我没有,那么我会得到404。“ home”视图是我的Web应用程序根目录,因此我只想在注销后将用户发送到那里。

@RequestMapping("/logout")
public ModelAndView logout() {
    // should be handled by spring security
    return new ModelAndView("home");
}

更新:这是最后似乎可行的解决方案(除了注销部分,仍然不起作用):

@Configuration
@Order(1) // HIGHEST
public static class OAuthSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/oauth").authorizeRequests().anyRequest().denyAll();
    }
}

@Configuration
public static class BasicAuthConfigurationAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/basic").authorizeRequests().anyRequest().authenticated().and().httpBasic();
        http.logout().permitAll().logoutUrl("/logout").logoutSuccessUrl("/").invalidateHttpSession(true);
        //.and().logout().logoutUrl("/basic/logout").invalidateHttpSession(true).logoutSuccessUrl("/");
    }
}
java spring-mvc spring-security basic-authentication spring-boot
2个回答
7
投票

我不确定是否注销,但是我们有一些类似的问题,即我们的某些网站处于基本状态,而有些则不在。我们的解决方案是仅对需要http basic的路径使用第二个嵌套配置类。我们为该配置指定了@Order(1)..但是我不确定是否有必要。

已更新代码

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
    private static final Logger LOG = LoggerFactory.getLogger(SecurityConfig.class);

    @Autowired
    public void registerAuthentication(AuthenticationManagerBuilder auth, Config appConfig) throws Exception {
        auth.inMemoryAuthentication()
            .withUser(appConfig.getString(APIConfig.CONFIG_KEY_MANAGEMENT_USER_NAME))
            .password(appConfig.getString(APIConfig.CONFIG_KEY_MANAGEMENT_USER_PASS))
            .roles(HyperAPIRoles.DEFAULT, HyperAPIRoles.ADMIN);        
    }



    /**
     * Following Multiple HttpSecurity approach:
     * http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#multiple-httpsecurity 
     */
    @Configuration
    @Order(1)
    public static class ManagerEndpointsSecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
            .antMatcher("/management/**").authorizeRequests().anyRequest().hasRole(HyperAPIRoles.ADMIN).and()
            .httpBasic();
        }
    }

    /**
     * Following Multiple HttpSecurity approach:
     * http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#multiple-httpsecurity 
     */
    @Configuration
    public static class ResourceEndpointsSecurityConfig extends WebSecurityConfigurerAdapter {        



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

            http
            //fyi: This adds it to the spring security proxy filter chain
            .addFilterBefore(createBBAuthenticationFilter(), BasicAuthenticationFilter.class)
            ;      
       }
    }
}

这似乎可以通过基本身份验证在/ management保护执行器端点,而其他端点则使用自定义身份验证令牌头。我们什么都不会提示(没有发出挑战)凭据。.我们必须注册其他东西才能继续(如果我们需要)。

希望这会有所帮助


0
投票

仅保护一条路径

@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception
{
    auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("user"))
            .roles("USER");
}

@Configuration
@Order(1)
public static class ManagerEndpointsSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/add/**").authenticated()
                .anyRequest().permitAll()
                .and()
                .httpBasic()
                .and().csrf().disable();
    }
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

}

© www.soinside.com 2019 - 2024. All rights reserved.